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
y
。
dplyr
有矢量化的方法吗?我什至不知道如何处理这个问题。
我们用 rleid
从 data.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
我有以下数据框:
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
有矢量化的方法吗?我什至不知道如何处理这个问题。
我们用 rleid
从 data.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