2015-03-03 100 views
0

我有一個大的數據幀,看起來水木清華這樣的:如何合併除一個列以外所有列中具有相同信息的行?

A 1 2 3 4 ... 
B 1 2 3 4 ... 
C 1 2 3 4 ... 
D 5 2 1 4 ... 
E 3 2 3 9 ... 
F 0 0 2 2 ... 
G 0 0 2 2 ... 

正如你可以看到一些行是重複的條目,如果你無視第二個第一列。我想結合/合併這些行產生這樣的:

A;B;C 1 2 3 4 ... 
D  5 2 1 4 ... 
E  3 2 3 9 ... 
F;G 0 0 2 2 ... 

我可以寫一個for循環,它迭代的行,但是這將是既不漂亮,也沒有效率。我很肯定有一個更好的方法來做到這一點。

我以爲我可以:

  1. 片的DF所以我除了第一slice <- df[, 2:ncols(df)]
  2. 所有列由dups <- df[duplicated(slice)]
  3. 得到所有「重複」行的數據幀得到另一個數據框的「獨特的」由uniq <- df[unique(slice)]
  4. 行合併使用他們所有,但第一列merge(uniq, dups, by...)

除了這將不起作用,因爲唯一不會返回索引,而是一個完整的數據幀,這意味着我不能索引df與從slice對應的行。

有什麼建議嗎?

編輯:我要澄清的是A,B,C ......不是字符串/字符表示給rownames但據幀的實際部分,參賽

+0

看看'聚合'和相關的聚合函數。 – A5C1D2H2I1M1N2O1R2T1 2015-03-03 11:06:07

回答

2

有多種功能,從而做到這一點。它們全部是共同的聚合功能:aggregate,tapply,by,...,當然,流行的「data.table」和「dplyr」功能集。

這裏的aggregate

aggregate(V1 ~ ., mydf, toString) 
# V2 V3 V4 V5 V6  V1 
# 1 0 0 2 2 ... F, G 
# 2 5 2 1 4 ...  D 
# 3 1 2 3 4 ... A, B, C 
# 4 3 2 3 9 ...  E 

其他選項(如在開篇中指出):

library(data.table) 
as.data.table(mydf)[, toString(V1), by = eval(setdiff(names(mydf), "V1"))] 

library(dplyr) 
mydf %>% 
    group_by(V2, V3, V4, V5, V6) %>% 
    summarise(V1 = toString(V1)) 

相反的toString,您可以使用經典paste(., collapse = ";")的做法,給你更多關於最終產出的靈活性。

+0

測試與聚合跳過大部分的數據,不知道爲什麼..可能會是一個問題嗎? – posdef 2015-03-03 14:30:44

+0

@posdef,是的。 「不適用」將是一個問題。如果您閱讀'?aggregate'上的幫助,您會看到公式方法中'na.action'參數的默認操作是'na.omit'。 – A5C1D2H2I1M1N2O1R2T1 2015-03-03 17:03:16

+0

data.table解決方案取得了訣竅,但我不太明白'by ='參數的工作原理。 – posdef 2015-03-04 10:33:35

相關問題