如果“flag”低于5,我想为数据集的每个用户恢复“value”的总和。
我可以使用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()
。$ c(20,10,4)中的错误:无效的下标类型'double'
答案 0 :(得分:2)
您不需要.$
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