如果“标志”低于 5,我想为数据集的每个用户恢复“值”的总和。
我可以使用 ifelse
而不是 which
但我不明白为什么这段代码不起作用:
df <- data.frame(
user_id = c(1, 1, 1, 2, 2, 2),
flag = c(2,5, 3, 1, 2, 7),
value = c(20, 10, 4, 3, 2, 2)
)
df
library(dplyr)
df2 =
df %>%
group_by(user_id) %>%
mutate(variable1 = sum(.$value[which(.$flag<5)]),
variable2 = sum(.$value[which(.$flag<10)])) %>%
ungroup()
Error in .$c(20, 10, 4) : invalid subscript type 'double'
最佳答案
您不需要.$
df %>%
group_by(user_id) %>%
mutate(variable1= sum(value[flag<5]), variable2 = sum(value[flag<10]))
# user_id flag value variable1 variable2
#1 1 2 20 24 34
#2 1 5 10 24 34
#3 1 3 4 24 34
#4 2 1 3 5 7
#5 2 2 2 5 7
#6 2 7 2 5 7
如果有多个变量,可以使用mutate_each
df$value2 <- c(22,12,7,5,2,1)
df %>%
group_by(user_id) %>%
mutate_each(funs(variable1=sum(.[flag<5]), variable2=sum(.[flag<10])),
starts_with('value'))
这是一种情况,我们通过使用 which
或不使用它得到不同的结果。
df$flag[1:3] <- NA
df %>%
group_by(user_id) %>%
mutate(variable1 = sum(value[which(flag <5)]))
# user_id flag value variable1
#1 1 NA 20 0
#2 1 NA 10 0
#3 1 NA 4 0
#4 2 1 3 5
#5 2 2 2 5
#6 2 7 2 5
没有which
df %>%
group_by(user_id) %>%
mutate(variable1 = sum(value[flag <5]))
# user_id flag value variable1
#1 1 NA 20 NA
#2 1 NA 10 NA
#3 1 NA 4 NA
#4 2 1 3 5
#5 2 2 2 5
#6 2 7 2 5
关于r - dplyr: group_by 和 which,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31091838/