2014-10-10 26 views
2

我想知道如何使用R合併一組數據中的行。R - 在一個數據集中加入/合併行

目前我的數據是這樣的:

Text 1  Text 2  Text 3  Text 4 
Bob  Aba   Abb   Abc 
Robert  Aba   Abb   Abc 
Fred  Abd   Abe   Abf 
Martin  Abg   Abh   Abi 

如果文本兩個文本3都爲兩行相同(如行1 & 2)我想用更多的把它做成一排其他數據的列。

Text 1  Text 1a Text 2   Text 3  Text 4  Text 4a 
Bob   Robert  Aba   Abb   Abc  Abd 
Fred  NA   Abd   Abe   Abf  NA 
Martin  NA   Abg   Abh   Abi  NA 

我與數據連接兩套獨立的,並使用加入

join=join(Data1, Data2, by = c('Text2'), type = "full", match = "all") 

,但我不能工作,如何一組數據中做了重複的將它們合併類似的東西。

我認爲有可能使用聚合,但我沒有使用它之前,我的嘗試是:

MyDataAgg=aggregate(MyData, by=list(MyData$Text1), c) 

但是當我嘗試,我得到一個輸出看起來像這樣的總結:

1 -none- numeric        
1 -none- numeric        
2 -none- numeric 

或本上結構:

$ Initials    :List of 12505 
    ..$ 1 : int 62 
    ..$ 2 : int 310 
    ..$ 3 : int 504 

我也想能夠排結合s使用兩個變量的匹配元素。

+0

您能否提供一些更詳細的信息?你需要重複多少列,只有'Text1'和'Text4'?你是否期望每個ID對有兩個以上的副本(潛在列的數量只有兩倍)? – ilir 2014-10-10 10:03:31

+0

在幾乎所有情況下,只有兩行是相同的 - 所以是列數的兩倍。我並不擔心在不太可能的情況下會丟失一些奇怪的數據,但有三行相同。但如果發生這種情況,它不得不中斷 - 所以我不能通過對數據進行排序並依靠其他所有記錄保持一致。還有比我的例子更多的變量。 – Wol44 2014-10-13 16:10:37

回答

1

我不認爲你可以重塑或累計因爲:

  1. 您有重複對應相同的密鑰
  2. 您不必爲每個鍵相同數量的值的行:你應與遺漏值

這裏使用by通過鑰匙來處理AA手動嘗試,rbind.fill填充它聚合所有列表在一起。每個by步驟,正在創建具有(Text2,Text3)作爲關鍵的單行數據幀。

do.call(plyr::rbind.fill,by(dat,list(dat$Text2,dat$Text3), 
    function(d){ 
    ## change all other columns to a one row data.frame 
    dd <- as.data.frame(as.list(rapply(d[,-c(2,3)],as.character))) 
    ## the tricky part : add 1 to a name like Text1 to become Text11 , 
    ## this is import to join data.frames formed by by 
    names(dd) <- gsub('(Text[0-9]$)','\\11',names(dd)) 
    ## add key to to the row 
    cbind(unique(d[,2:3]),dd) 
    })) 

Text2 Text3 Text11 Text12 Text41 Text42 
1 Aba Abb Bob Robert Abc Abd 
2 Abd Abe Fred <NA> Abf <NA> 
3 Abg Abh Martin <NA> Abi <NA> 
+0

謝謝你。但是,我仍然無法完成它的工作。除了更改數據和文本,還有其他任何我需要修改的部分嗎? – Wol44 2014-10-13 16:00:03

+0

@ Wol44你會得到什麼錯誤?請在該問題中添加一個'dput(head(data_frame))'。 – agstudy 2014-10-13 16:03:26