【问题标题】:How to merge tables in R?如何在 R 中合并表?
【发布时间】:2012-10-15 13:59:01
【问题描述】:

我认为这会有一个简单的答案,但我无法解决!以下是使用iris 数据集的示例:

a <- table(iris[,2])
b <- table(iris[,3]) 

如何将这两个表加在一起?例如,在新的输出表中,变量 3 的值为 27 (26+1),变量 3.3 的值为 8 (6+2)。

非常感谢任何帮助。

【问题讨论】:

    标签: r merge


    【解决方案1】:

    如果您想使用ab 中都存在的变量,这将起作用:

    n <- intersect(names(a), names(b))
    a[n] + b[n]
    
    #  3 3.3 3.5 3.6 3.7 3.8 3.9   4 4.1 4.2 4.4 
    # 27   8   8   5   4   7   5   6   4   5   5
    

    如果要使用所有变量:

    n <- intersect(names(a), names(b)) 
    
    res <- c(a[!(names(a) %in% n)], b[!(names(b) %in% n)], a[n] + b[n])
    
    res[order(names(res))] # sort the results
    

    【讨论】:

    • 谢谢。是否可以对其进行修改以保留两个数据集中都不存在但仅存在于一个数据集中的值?我需要一个包含 所有 数据的总数,包括您的代码所示的合并的公共值。
    • @SvenHohenstein 感谢您的更新。使用提供的iris 示例,[-n] 似乎无效。
    • @SvenHohenstein 这又近了一步!但是,例如 3.8 在结果表中出现 3 次。理想情况下,最终表格将仅捕获 2 个值的总和,而不是原始值。有什么方法可以只保留组合值并删除其他值?再次感谢您的帮助。
    【解决方案2】:
    temp<-merge(a,b,by='Var1')
    temp$sum<-temp$Freq.x + temp$Freq.y
    
       Var1 Freq.x Freq.y sum
    1     3     26      1  27
    2   3.3      6      2   8
    3   3.5      6      2   8
    4   3.6      4      1   5
    5   3.7      3      1   4
    6   3.8      6      1   7
    7   3.9      2      3   5
    8     4      1      5   6
    9   4.1      1      3   4
    10  4.2      1      4   5
    11  4.4      1      4   5
    

    【讨论】:

      【解决方案3】:

      这是另一个:

      transform(merge(a,b, by="Var1"), sum=Freq.x + Freq.y)
         Var1 Freq.x Freq.y sum
      1     3     26      1  27
      2   3.3      6      2   8
      3   3.5      6      2   8
      4   3.6      4      1   5
      5   3.7      3      1   4
      6   3.8      6      1   7
      7   3.9      2      3   5
      8     4      1      5   6
      9   4.1      1      3   4
      10  4.2      1      4   5
      11  4.4      1      4   5
      

      【讨论】:

        【解决方案4】:

        这是merge() 解决方案的一个稍微有点折磨的单行版本:

        do.call(function(Var1, Freq.x, Freq.y) data.frame(Var1=Var1, Freq=rowSums(cbind(Freq.x, Freq.y))), merge(a, b, by="Var1"))
        

        如果你想使用所有变量,这里是一个:

        do.call(function(Var1, Freq.x, Freq.y) data.frame(Var1=Var1, Freq=rowSums(cbind(Freq.x, Freq.y), na.rm=TRUE)), merge(a, b, by="Var1", all=TRUE))
        

        transform() 单行不同,它不会累积 .x 和 .y,因此可以迭代使用。

        【讨论】:

          【解决方案5】:

          data.table包的合并功能可能是你想要的:https://rpubs.com/ronasta/join_data_tables

          【讨论】:

            猜你喜欢
            • 2013-07-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-20
            相关资源
            最近更新 更多