【问题标题】:Add two dataframes; same dimension; different order column添加两个数据框;相同的维度;不同的顺序列
【发布时间】:2015-05-29 21:42:12
【问题描述】:

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

【问题讨论】:

    标签: r


    【解决方案1】:

    最安全的方法可能是绑定和聚合

    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 函数关注列名,因此它会正确堆叠您的值。

    【讨论】:

      【解决方案2】:

      我将重复我的建议 from the comments last time -- 考虑将 Type 放在行名中:

      DF1 <- data.frame(df1[-1],row.names=df1$Type)
      DF2 <- data.frame(df2[-1],row.names=df2$Type)
      

      从这里开始,添加很简单:

      DF1 + DF2[names(DF1)]
      #       CA AR Total
      # alpha  6  6    12
      # beta   7  7    14
      # gamma  7 11    18
      # delta  9  5    14
      

      几个警告:如果你的行没有以相同的方式排序,这将无法正常工作(这就是为什么@MrFlick 的方法是“安全的”)。此外,对更多数据帧的扩展在这里也不是那么优雅:

      Reduce(`+`,lapply(list(DF2,DF3,DF4),`[`,order(names(DF1))),init=DF1) # here
      aggregate(.~Type, rbind(df1,df2,df3,df4), sum)                       # @MrFlick
      

      【讨论】:

      • 我不确定我是否真的会考虑将“类型”设置为rownames。对于初学者,rownames 不允许重复。另一方面,今天至少有两个非常常用的软件包忽略了rownames,除非特别要求,即使这样,也将rownames 作为一列放回。也就是说,重复的rownames 是允许使用矩阵。
      • @AnandaMahto 我最初的建议 (stackoverflow.com/a/30489085/1191259) 是使用矩阵,但从 OP 在随后的几个问题中继续使用相同的示例数据来看,这没有任何吸引力。我认为在 data.frame 上使用 rownames 至少是朝着这个方向迈出的一步,但是是的,我可能不会这样做,因为我总是使用矩阵或 data.tables。我怀疑在 OP 的情况下没有重复的行(因为这似乎是一个用于显示目的的汇总表,并且边缘上的欺骗会很奇怪),但真的不知道。
      【解决方案3】:

      您可以考虑将数据存储为“长”格式,这将使进一步的操作更加直接。

      如果您的data.frames 在list 中,您可以轻松地使用“reshape2”中的melt 来获得“长”data.frame。例如:

      melt(list(df1, df2), id.vars = "Type")
      

      一旦数据为长格式,您可以使用dcast 将其重新整形为“宽”格式,并在该阶段执行您想要的任何聚合。


      此外,如果您在工作区中使用mget 具有类似名称的data.frames,则可以概括list 的创建。

      这是一个例子,假设我们有两个data.frames,一个名为“df1”,一个名为“df2”:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-21
        • 1970-01-01
        • 2021-03-20
        • 2017-07-26
        • 1970-01-01
        • 2013-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多