2014-03-03 67 views
0

我有data.frame,其中一些列具有相同的名稱。現在我想將這些列合併/合併爲單列。因此,例如,我想打開....將具有相同名稱的不同列合併到單個列中

v1 v1 v1 v2 v2 
1 0 2 4 1 
3 1 1 1 0 

... INTO ...

v1 v2 
3 5 
5 1 

我只找到了解決所謂2個data.frame小號線程被合併成一個但沒有人處理這個(相當簡單?)的問題。


的數據可以與此被重新創建:

df <- structure(list(v1 = c(1L, 3L), v1 = 0:1, v1 = c(2L, 1L), 
       v2 = c(4L, 1L), v2 = c(1L, 0L)), 
       .Names = c("v1", "v1", "v1", "v2", "v2"), 
       class = "data.frame", row.names = c(NA, -2L)) 
+0

歡迎來到StackOverflow!請提供[可重現的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。 – Thomas

+0

同意@Thomas,在這種情況下,我可以用'read.table'重新創建你的數據表,但是如果你有'dput',它會更好。 – BrodieG

+0

謝謝你的答案,它現在有效。下次我當然會嘗試提供一個可重複的例子! – bla

回答

1
as.data.frame(lapply(split.default(df, names(df)), function(x) Reduce(`+`, x))) 

生產:

v1 v2 
1 3 5 
2 5 1 

split.default(...)中斷了數據幀分成組以相等的列名,則我們使用Reduce對這些組中的每個組進行迭代求和,直到該組中的每一列的值e是每組只剩下一列(請參閱?Reduce,這是該功能的作用),最後我們轉換回數據框爲as.data.frame

我們必須使用split.default因爲split(或真的,split.data.frame,它將派遣)分裂的行,列沒有。

0

您可以用「reshape2」中的meltdcast輕鬆完成此操作。由於沒有「id」變量,我用melt(as.matrix(df))而不是melt(df, id.vars="id")。這會自動創建一個包含「Var1」的數據的長版本,將您的rownames和「Var2」表示爲colnames。使用這些知識,你可以這樣做:

library(reshape2) 
dcast(melt(as.matrix(df)), Var1 ~ Var2, 
     value.var = "value", fun.aggregate=sum) 
# Var1 v1 v2 
# 1 1 3 5 
# 2 2 5 1 
相關問題