R Сгруппировать с условными и суммировать другие столбцы, используя data.table - PullRequest
1 голос
/ 14 февраля 2020

Я хочу суммировать все столбцы, кроме одного указанного c столбца, на основе условия по группам.

Например:

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   

Я хочу СУММА P2, P3, P4, а затем APPEND P1 когда Condition равно "0" на Col1 и 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] является ключом, но все еще не имеет представления.

1 Ответ

2 голосов
/ 14 февраля 2020

Мы можем сгруппировать по 'Col1', 'Col2', затем summarise_at столбцам, которые starts_with 'P' (изменен на диапазон столбцов согласно запросу OP), чтобы получить sum значений, где 'Condition 'равен 0, а затем создайте столбец «Условие», равный 0

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]
...