dplyr 条件求和

dplyr conditional summation

我有以下数据框:

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 ydplyr 有矢量化的方法吗?我什至不知道如何处理这个问题。

我们用 rleiddata.table 创建一个分组变量,如果有超过 3 个元素 (n() >3) 则得到 'x' 的 sum if all 'y' 中的元素为 TRUE 或 else return 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))]

如果没有 3 个 TRUE 值,问题没有指定使用什么值,所以我们将使用 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