添加两个数据帧;相同的维度;不同的订单栏

时间:2015-05-29 21:42:13

标签: r

我有一个数据框,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

3 个答案:

答案 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