dplyr:group_by和哪个

时间:2015-06-27 18:04:29

标签: r dplyr

如果“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'

1 个答案:

答案 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