【问题标题】:How to combine two rows in R?如何在R中合并两行?
【发布时间】:2016-01-12 23:13:56
【问题描述】:

我想根据行名组合/求和两行以在 R 中创建一行。最好的方法可能是创建一个新行并将这两行加在一起。

例子df:

A  1  3  4  6  
B  3  2  7  9
C  6  8  1  2 
D  3  2  8  9

其中 A、B、C、D 是行名,我想将两行(A 和 C)合并/求和以得到:

A+C  7  11  5  8  
B    3  2   7  9
D    3  2   8  9

谢谢。

【问题讨论】:

  • 您可能想查看任意数量的 R 文本介绍,这是非常基本的数据操作。通常,这些类型的操作在列上比在行上更容易执行,因此您可能需要考虑转置数据。

标签: r


【解决方案1】:

aggregate 救援:

aggregate(df, list(Group=replace(rownames(df),rownames(df) %in% c("A","C"), "A&C")), sum)
#  Group V2 V3 V4 V5
#1   A&C  7 11  5  8
#2     B  3  2  7  9
#3     D  3  2  8  9

【讨论】:

    【解决方案2】:

    您可以使用标准加法算术运算符替换A 行,然后使用逻辑语句删除C 行。

    df["A", ] <- df["A", ] + df["C", ]
    df[rownames(df) != "C", ]
    #   V2 V3 V4 V5
    # A  7 11  5  8
    # B  3  2  7  9
    # D  3  2  8  9
    

    对于超过两行,您可以使用colSums() 进行添加。这假定nm 中的第一个值是我们要替换/保留的值。

    nm <- c("A", "C")
    df[nm[1], ] <- colSums(df[nm, ])
    df[!rownames(df) %in% nm[-1], ]
    

    我将由您来更改行名。 :)

    数据:

    df <- structure(list(V2 = c(1L, 3L, 6L, 3L), V3 = c(3L, 2L, 8L, 2L), 
        V4 = c(4L, 7L, 1L, 8L), V5 = c(6L, 9L, 2L, 9L)), .Names = c("V2", 
    "V3", "V4", "V5"), class = "data.frame", row.names = c("A", "B", 
    "C", "D"))
    

    【讨论】:

      【解决方案3】:

      矩阵乘法?

      > A <- matrix(c(1,0,0,0,1,0,1,0,0,0,0,1), 3)
      > A                                        
           [,1] [,2] [,3] [,4]
      [1,]    1    0    1    0
      [2,]    0    1    0    0
      [3,]    0    0    0    1
      > A %*% X
           V2 V3 V4 V5
      [1,]  7 11  5  8
      [2,]  3  2  7  9
      [3,]  3  2  8  9
      

      或者对稀疏矩阵使用Matrix 包:

      fac2sparse(factor(c(1,2,1,4))) %*% X
      

      【讨论】:

        猜你喜欢
        • 2022-01-15
        • 2021-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-20
        • 2018-06-09
        • 2018-04-18
        • 1970-01-01
        相关资源
        最近更新 更多