dplyr条件求和

时间:2018-09-24 15:07:50

标签: r dplyr cumsum

我有以下数据框:

Employee.scope("byDepartment").where(....) <-- how to pass in a department value ?

我想创建第三列awk 'BEGIN{FS=OFS=","}{$5="SOME NEW TEXT"}1' file ,它将是列set.seed(42) df <- data_frame(x = sample(0:100, 50, replace = T), y = sample(c(T, F), 50, replace = T)) 的总和,但前提是{{1}列的行中有3个以上的z 1}}。 是否有使用x的矢量化方法?我什至不知道该如何处理。

2 个答案:

答案 0 :(得分:1)

我们使用rleid中的data.table创建一个分组变量,如果元素(sum和{{1)超过3,则得到'x'的n() >3 }} if中的y元素为TRUE或all返回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

答案 1 :(得分:1)

如果没有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