我有一个数据框,df1:
Type CA AR Total
alpha 2 3 5
beta 1 5 6
gamma 6 2 8
delta 8 1 9
和数据框,df2:
Type AR CA Total
alpha 3 4 7
beta 2 6 8
gamma 9 1 10
delta 4 1 5
我想添加两个数据帧,以便" CA"加在一起,并且" AR"加在一起。基本上,每个标题下的值应加在一起。
生成的df应如下所示:
Type AR CA Total
alpha 6 6 12
beta 7 7 14
gamma 11 7 18
delta 5 9 14
例如:(AR,gamma)= 2 + 9 = 11
答案 0 :(得分:4)
最安全的方法可能是绑定和聚合
aggregate(.~Type, rbind(df1,df2), sum)
# Type CA AR Total
# 1 alpha 6 6 12
# 2 beta 7 7 14
# 3 delta 9 5 14
# 4 gamma 7 11 18
rbind.data.frame
函数会关注列名,以便正确堆叠您的值。
答案 1 :(得分:3)
我会重复我的建议from the comments last time - 考虑将find . -type f | paste -d, -s
放入rownames:
Type
从这里开始,添加很简单:
DF1 <- data.frame(df1[-1],row.names=df1$Type)
DF2 <- data.frame(df2[-1],row.names=df2$Type)
一些注意事项:如果您的行没有以相同的方式排序,这将无法正常工作(这就是为什么@ MrFlick的方法是“安全的”)。此外,更多数据框的扩展在这里并不那么优雅:
DF1 + DF2[names(DF1)]
# CA AR Total
# alpha 6 6 12
# beta 7 7 14
# gamma 7 11 18
# delta 9 5 14
答案 2 :(得分:2)
您可以考虑将数据存储在&#34; long&#34;相反,这会使进一步的操作变得更加直截了当。
如果您在data.frame
中拥有list
,则可以轻松地使用来自&#34; reshape2&#34;的melt
得到一个&#34;长&#34; data.frame
。例如:
melt(list(df1, df2), id.vars = "Type")
一旦数据为长格式,您就可以将其重塑为广泛的数据。使用dcast
形成表单,并在该阶段执行您想要的任何聚合。
此外,如果您在工作区中使用list
命名为data.frame
,则可以概括mget
的创建。
这是一个例子,假设我们有两个data.frame
,一个名为&#34; df1&#34;,一个名为&#34; df2&#34;:
library(reshape2)
dcast(melt(mget(ls(pattern = "df\\d+")), id.vars = "Type"),
Type ~ variable, value.var = "value", fun.aggregate = sum)
# Type CA AR Total
# 1 alpha 6 6 12
# 2 beta 7 7 14
# 3 delta 9 5 14
# 4 gamma 7 11 18