2015-06-27 3 views
1

Я хотел бы восстановить для каждого пользователя набора данных суммы «значения», если «флаг» ниже 5.dplyr: group_by и который

я мог бы использовать 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): неверный тип подстрочный 'двойной'

+1

Вам не нужно '. $' – akrun

+0

Извините df2%>% была ошибка, которую я только что отредактировали – Ricol

ответ

2

Вы надеваете» t .$

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 
+0

Почему 'which' также не требуется? – Ricol

+0

@Ricol Флаг akrun

Смежные вопросы