【问题标题】:R Group by with conditional and sum other columns using data.tableR 使用条件分组并使用 data.table 对其他列求和
【发布时间】:2020-02-14 20:56:13
【问题描述】:

我想根据分组条件对除一个特定列之外的所有列求和。

例如:

Col1    Col2   Condition   Name    P1    P2    P3    P4 
1990    1      0           APPLE   10    20    20    30   
1990    1      1           BAN     30    40    50    50   
1990    1      1           CAR     40    40    30    40   
1990    2      0           DOG     100   20    30    40   
1990    2      1           APPLE   10    20    20    30   
1990    2      1           APPLE   50    20    20    30   

我想 SUM P2, P3, P4 然后 APPEND P1 Condition 等于 "0" by @987654328 @ 和Col2

所以结果会是:

Col1    Col2   Condition     P1    P2     P3    P4 
1990    1      0             10    100    100   120     
1990    2      0             100   60     70    100   

我知道如何添加data.table,但对此一无所知。

DT[, .(lapply(.SD, sum, na.rm=TRUE), by=.(Col1, Col2), .SDcols=c("P2", "P3", "P4")] 

似乎DT[, setdiff(names(DT), c("P2", "P3", "P4")), with = FALSE] 是一个关键,但仍然不知道。

【问题讨论】:

    标签: r data.table data-manipulation


    【解决方案1】:

    我们可以按 'Col1'、'Col2' 和 summarise_at 分组 starts_with 'P' 的列(根据 OP 的要求更改为列范围)以获得 sum 的值,其中 'Condition ' 为 0,然后创建一个 0 的 'Condition' 列

    library(dplyr)
    df1 %>% 
      group_by(Col1, Col2) %>%
      group_by(P1 = sum(P1[Condition == 0]), add = TRUE) %>% 
      summarise_at(vars(P2:P4), sum) %>%
      mutate(Condition = 0) %>%
      ungroup 
    # A tibble: 2 x 7
    #   Col1  Col2    P1    P2    P3    P4 Condition
    #  <int> <int> <int> <int> <int> <int>     <dbl>
    #1  1990     1    10   100   100   120         0
    #2  1990     2   100    60    70   100         0
    

    或使用data.table

    library(data.table)
    setDT(df1)[,  P1 := sum(P1[Condition == 0]), .(Col1, Col2)][, 
         lapply(.SD, sum) , .(Col1, Col2, P1), .SDcols = P2:P4]
    

    【讨论】:

    • data.table的方法吗?此外,starts_with() 不起作用,因为列名不同。我只是使用P2, P3, P4,但实际上它们是不同的。
    • @PeterChen 列名是否在范围内
    • 是的,它们在范围内。我认为.SDcols = P2:P4 有效。
    • 也可以使用[] 合二为一,例如c df[, c(P1 = P1[Condition == 0], lapply(.SD, sum)), .(Col1, Col2), .SDcols = P2:P4]
    猜你喜欢
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2012-01-03
    • 1970-01-01
    • 2014-04-20
    相关资源
    最近更新 更多