【问题标题】:Merge rows having same values in multiple columns合并多列中具有相同值的行
【发布时间】:2015-07-09 17:56:38
【问题描述】:

我有一个包含多行多列(13232 行和 18 列)的 excel 文件。最后一列给出了一些价值。我想要做的是 - 找到除最后一个之外具有相同列详细信息的行并将它们的最后一列值相加。 例如: 如果输入是

+---------+---------+---------+---------+
| Column1 | Column2 | Column3 | Column4 |
+---------+---------+---------+---------+
| ABC     | DEF     | GHI     |       5 |
| XYZ     | PQR     | LMN     |       4 |
| ABC     | DEF     | GHI     |      11 |
| Test1   | Test2   | Test3   |      12 |
| XYZ     | PQR     | LMN     |      54 |
+---------+---------+---------+---------+

那么输出应该是

+---------+---------+---------+---------+
| Column1 | Column2 | Column3 | Column4 |
+---------+---------+---------+---------+
| ABC     | DEF     | GHI     |      16 |
| XYZ     | PQR     | LMN     |      58 |
| Test1   | Test2   | Test3   |      12 |
+---------+---------+---------+---------+

如何在 R 中实现这一点?

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以从base R使用aggregate

     aggregate(Column4~., df1, FUN=sum)
     #    Column1 Column2 Column3 Column4
     #1     ABC     DEF     GHI      16
     #2     XYZ     PQR     LMN      58
     #3   Test1   Test2   Test3      12
    

    或者

     library(data.table)
     setDT(df1)[, list(Column4=sum(Column4)), by = c(names(df1)[1:3])]
     #     Column1 Column2 Column3 Column4
     #1:     ABC     DEF     GHI      16
     #2:     XYZ     PQR     LMN      58
     #3:   Test1   Test2   Test3      12
    

    或者

     library(sqldf)
     sqldf('select Column1, Column2, Column3,
              sum(Column4) as Column4
              from df1 
              group by Column1, Column2, Column3')
     #   Column1 Column2 Column3 Column4
     #1     ABC     DEF     GHI      16
     #2   Test1   Test2   Test3      12
     #3     XYZ     PQR     LMN      58
    

    或者

    library(dplyr)
    df1 %>% group_by(Column1, Column2, Column3) %>%
      summarize(Column4 = sum(Column4))
    # Source: local data frame [3 x 4]
    # Groups: Column1, Column2
    
    #   Column1 Column2 Column3 Column4
    # 1     ABC     DEF     GHI      16
    # 2   Test1   Test2   Test3      12
    # 3     XYZ     PQR     LMN      58
    

    可重现的数据:

    df1 <-
    structure(list(Column1 = structure(c(1L, 3L, 1L, 2L, 3L), .Label = c("ABC", 
    "Test1", "XYZ"), class = "factor"), Column2 = structure(c(1L, 
    2L, 1L, 3L, 2L), .Label = c("DEF", "PQR", "Test2"), class = "factor"), 
        Column3 = structure(c(1L, 2L, 1L, 3L, 2L), .Label = c("GHI", 
        "LMN", "Test3"), class = "factor"), Column4 = c(5L, 4L, 11L, 
        12L, 54L)), .Names = c("Column1", "Column2", "Column3", "Column4"
    ), class = "data.frame", row.names = c(NA, -5L))
    

    【讨论】:

    • 我不知道你可以像这样直接使用聚合。优秀的。我认为你必须给它一个更清晰的变量。
    • @BrandonBertelsen 我们可以使用公式方法或您显示的带有列表的方法。谢谢你的cmets
    猜你喜欢
    • 2021-07-16
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2022-12-16
    • 2021-04-26
    相关资源
    最近更新 更多