2014-03-03 69 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 
相关问题