将具有相同名称的不同列合并为单个列

时间:2014-03-03 19:04:16

标签: r merge dataframe aggregate

我有一个data.frame,其中一些列具有相同的名称。现在我想将这些列合并/添加到单个列中。所以例如我想转......

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

... INTO ...

v1  v2
 3   5  
 5   1  

我只发现处理两个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))

2 个答案:

答案 0 :(得分: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迭代地对组中每列的值求和,直到只有一列每组左侧(参见?Reduce,这就是函数的作用),最后我们使用as.data.frame转换回数据框。

我们必须使用split.default因为split(或实际上,split.data.frame,它将调度)在行而不是列上进行拆分。

答案 1 :(得分: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