我有一个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))
答案 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”中的melt
和dcast
轻松完成此操作。由于没有“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