2016-06-22 2 views
1

Каков правильный способ изменения списка? В данном конкретном случае список возвращается на splitКак использовать mutate в списке?

library(dplyr) 
csv<-data.frame(participant_number=c(1,1,1,2,2),SelfEsteem=c(3,4,2,1,3)) 
csv<-csv%>%split(.,.$participant_number)%>%mutate(.,var(.$SelfEsteem)) 

Ошибка:

Error in UseMethod("mutate_") : 
    no applicable method for 'mutate_' applied to an object of class "list" 

UPDATE В ответ на комментарии: Я намерен вычислить дисперсию SelfEsteem каждой группы (группировка ВДП participant_number). Если я попробую group_by, я не получу ожидаемого результата .... Почему?

library(dplyr) 

#Please note I changed the dataframe to make my point about variance differences more obvious 
csv<-data.frame(participant_number=c(1,1,1,2,2),SelfEsteem=c(3,4,2,1,3)) 

csv<-csv%>%group_by(participant_number)%>%mutate(.,SE_variance=var(.$SelfEsteem)) 

#var(c(3,4,2)) #1 
#var(c(1,3)) #2 

Ожидаемое:

 participant_number SelfEsteem SE_variance 
(dbl)   (dbl)  (dbl) 
1     1   3   1 
2     1   4   1 
3     1   2   1 
4     2   1   2 
5     2   3   2 
+1

'd' в' dplyr' предназначен для фреймов данных. Если вы хотите мутировать каждый фрейм данных в списке, вы делаете то же самое, что и все остальные кадры данных в списке 'lapply', for loop или' purrr'. – Gregor

+2

Хотя из вашего примера, почему вы пытаетесь «разбить»? Просто 'group_by' и сохраните его как один фрейм данных. – Gregor

+0

Вы намерены применять различные мутации для каждого списка? – zx8754

ответ

3

Попытка с group_by терпит неудачу, потому что вы переопределения mutate «s путь поиска. Mutate использует нестандартную оценку, поэтому он будет искать переменные сначала среди столбцов своего аргумента data.

При использовании труб (%>%), точка . относится к всему кадру данных и .$SelfEsteem относится ко всей колонке Самооценки из кадра данных целом.

Вам просто нужно немного упростить (не переопределять значения по умолчанию), чтобы получить ожидаемый результат.

csv %>% 
    group_by(participant_number) %>% 
    mutate(SE_variance = var(SelfEsteem)) 
# Source: local data frame [5 x 3] 
# Groups: participant_number [2] 
# 
# participant_number SelfEsteem SE_variance 
#    (dbl)  (dbl)  (dbl) 
# 1     1   3   1 
# 2     1   4   1 
# 3     1   2   1 
# 4     2   1   2 
# 5     2   3   2 
1

Если вам действительно нужно использовать list объект, вы можете mutate с list помощью map:

library(dplyr) 
library(purr) 

csv %>% 
    split(.,.$participant_number) # your list 
    map(~mutate(.,var(.$SelfEsteem))) # this will mutate a list 

Теперь вы можете положить все обратно вместе с bind_rows()

csv %>% 
    split(.,.$participant_number) %>% 
    map(~mutate(.,var(.$SelfEsteem))) %>% 
    bind_rows() 

и вы получаете то, что вам нужно.

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