Обработка списков списков по группам

Я хотел бы обработать список списков. В частности, я хочу извлечь кадр данных, который является третьим членом каждого списка, с помощью группирующей переменной (первый член каждого списка), а затем использовать несколько функций, таких как mean(), median(), sd(), length() и т. д. данные в этой группе. Затем вывод возвращается в кадре данных и будет выглядеть примерно так:

Grp   mean sd  ... 
 a    5.26 ... ...
 b    6.25 ... ...

#fake data
test<-list(
         #member 1=grouping var, 2=identity, 3=dataframe
         list("a", 54, data.frame(x=c(1,2)  ,y=c(3,4))),
         list("b", 55, data.frame(x=c(5,6)  ,y=c(7,8))),
         list("a", 56, data.frame(x=c(9 ,10),y=c(11,12))),
         list("b", 57, data.frame(x=c(13,14),y=c(15,NA)))
         )

#what I thought could work but kicks out a strange error

test2 <-ldply(test, .fun=unlist)
#note limited to just mean for now
tapply(test, factor(test$V1), FUN=function(x){mean(as.numeric(x[3:6]), na.rm=TRUE)}, simplify=TRUE)

Итак, мои вопросы: 1. Почему вышеперечисленное не работает? 2. Это кажется очень неуклюжим, есть ли более эффективный способ сделать это?


person TBP    schedule 18.11.2016    source источник
comment
Каковы ваши желаемые результаты?   -  person alistaire    schedule 19.11.2016
comment
Чего вы пытаетесь добиться, несколько неясно, но, может быть, что-то вроде library(tidyverse) ; test %>% map_df(~mutate(.x[[3]], grp = .x[[1]])) %>% group_by(grp) %>% summarise_all(mean, na.rm = TRUE)   -  person alistaire    schedule 19.11.2016
comment
отредактировано для решения вашего вопроса о повторном выводе.   -  person TBP    schedule 19.11.2016
comment
Итак, вы смешиваете значения x и y вместе, когда принимаете mean/sd/и т. д.?   -  person alistaire    schedule 19.11.2016
comment
да, они забиты   -  person TBP    schedule 19.11.2016
comment
Я не спрашиваю, одинаковы ли они; Я спрашиваю, берете ли вы среднее значение x и среднее значение y или среднее значение x и y. Если первое, см. выше. Если последнее, test %>% map_df(~mutate(.x[[3]], grp = .x[[1]])) %>% gather(var, val, x, y) %>% group_by(grp) %>% summarise_at('val', funs(mean, sd), na.rm = TRUE) или test %>% map_df(~data.frame(val = unlist(.x[[3]]), grp = .x[[1]])) %>% group_by(grp) %>% summarise_all(funs(mean, sd), na.rm = TRUE)   -  person alistaire    schedule 19.11.2016


Ответы (1)


В базе R вы можете сделать:

df_list <- tapply(test, 
                  sapply(test, `[[`,1), 
                  FUN=function(x) do.call(rbind,lapply(x, `[[`,3)))
t(sapply(df_list, function(x){
  list("mean"=mean(unlist(x), na.rm = T),
       "sd"=sd(unlist(x), na.rm = T),
       "median"=median(unlist(x), na.rm = T))}))

  mean     sd       median
a 6.5      4.440077 6.5   
b 9.714286 4.151879 8   
person HubertL    schedule 18.11.2016
comment
что бы это сделать. Благодарю вас! - person TBP; 19.11.2016