【问题标题】:Using R to group data by class then get sum of all columns使用 R 按类对数据进行分组,然后获取所有列的总和
【发布时间】:2018-09-07 00:01:14
【问题描述】:

我的数据如下所示:

NAME     TYPE        REP     PRODUCT1   PRODUCT2  ...  PRODUCT30
Name1    Wholesale   HA      4500.00    0.00      ...  760.00
Name2    Retail      BM      89.00      0.00      ...  0.00
Name3    Wholesale   HA      1000.00    800.00    ...  0.00
Name4    Wholesale   BM      3000.00    100.00    ...  0.00
Name5    Wholesale   BM      2000.00    0.00      ...  0.00

我想创建一个汇总表,其中包含每个 REP 和 TYPE 的 PRODUCT1 到 PRODUCT30 的总销售额。所以,结果会是这样的

REP   TYPE       TOTAL1    TOTAL2  ...  TOTAL30
HA    Wholesale  5500.00   800.00       760.00
BM    Retail     89.00     0.00         0.00
BM    Wholesale  5000.00   100.00       0.00

我尝试了以下代码的不同变体,但无济于事

groupedsales <- group_by(sales, REP, TYPE) %>% summarise_all(sum())

我知道我可以使用

groupedsales <- group_by(sales, REP, TYPE) %>%    summarise(TOTAL1=sum(PRODUCT1), TOTAL2=sum(PRODUCT2), ... TOTAL30=sum(PRODUCT30)

但我认为必须有一种更简单的方法来获取每列的总和。请帮忙!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以从base R使用aggregate

    aggregate(.~ REP + TYPE, df[-1], sum)
    

    或与summarise_at 来自dplyr

    library(dplyr)
    df %>%
       group_by(REP, TYPE) %>%
       summarise_at(vars(starts_with("PRODUCT")), sum) %>%
       rename_at(3:ncol(.), ~ paste0("TOTAL", seq_len(ncol(df) - 3)))
    

    【讨论】:

    • 完美!谢谢。
    【解决方案2】:

    使用data.table可以试试

    df <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "NAME     TYPE        REP     PRODUCT1   PRODUCT2   PRODUCT30
    Name1    Wholesale   HA      4500.00    0.00      760.00
                     Name2    Retail      BM      89.00      0.00       0.00
                     Name3    Wholesale   HA      1000.00    800.00     0.00
                     Name4    Wholesale   BM      3000.00    100.00     0.00
                     Name5    Wholesale   BM      2000.00    0.00       0.00")
    library(data.table)
    setDT(df)[,lapply(.SD,sum),by=.(TYPE, REP),.SDcols = names(df)[4:6]]
    
    #returns
            TYPE REP PRODUCT1 PRODUCT2 PRODUCT30
    1: Wholesale  HA     5500      800       760
    2:    Retail  BM       89        0         0
    3: Wholesale  BM     5000      100         0
    

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 2020-07-14
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 2020-08-15
      • 2017-06-27
      • 1970-01-01
      • 2016-06-05
      相关资源
      最近更新 更多