условное суммирование - PullRequest
       9

условное суммирование

0 голосов
/ 24 сентября 2018

У меня есть следующий фрейм данных:

set.seed(42)
df <- data_frame(x = sample(0:100, 50, replace = T), 
                 y = sample(c(T, F), 50, replace = T))

Я хотел бы создать третий столбец z, который будет суммой столбца x, но только если их больше 3 true с в столбце y.Есть ли векторизованный способ сделать это с dplyr?Я даже не знаю, как подойти к этому.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

В вопросе не указано, какие значения использовать, если нет 3 ИСТИННЫХ значений, поэтому мы будем использовать 0.

library(dplyr)
library(zoo)

sum3 <- function(z) all(z[, "y"]) * sum(z[, "x"])
df %>% mutate(sum = rollapplyr(df, 3, sum3, by.column = FALSE, fill = 0))

, давая:

 # A tibble: 50 x 3
       x y       sum
   <int> <lgl> <int>
 1    92 TRUE      0
 2    94 TRUE      0
 3    28 TRUE    214
 4    83 FALSE     0
 5    64 TRUE      0
 6    52 FALSE     0
 7    74 FALSE     0
 8    13 TRUE      0
 9    66 TRUE      0
10    71 FALSE     0
# ... with 40 more rows
0 голосов
/ 24 сентября 2018

Мы создаем группирующую переменную с rleid из data.table и получаем sum из 'x', если имеется более 3 элементов (n() >3) и if all элементов в 'y'ИСТИНА или else возврат NA

library(dplyr)
library(data.table)
df %>% 
  group_by(grp = rleid(y)) %>% 
  mutate(Sum = if(n() > 3 & all(y)) sum(x) else NA_integer_) %>%
  ungroup %>%
  select(-grp)

Это также можно сделать с помощью data.table

library(data.table)
setDT(df)[,  Sum := sum(x) * NA^(!((.N > 3) & all(y))), .(grp = rleid(y))]
...