2016-11-18 13 views
0

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

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. Это кажется очень неуклюжим, есть ли более эффективный способ сделать это?

+0

Каковы ваши желаемые результаты? – alistaire

+1

То, что вы пытаетесь выполнить, несколько нечетко, но может быть что-то вроде 'library (tidyverse); test%>% map_df (~ mutate (.x [[3]], grp = .x [[1]]))%>% group_by (grp)%>% summaryise_all (mean, na.rm = TRUE) ' – alistaire

+0

отредактирован для ответа на ваш вопрос. – TBP

ответ

3

В базовой 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 
+0

, что бы это сделать. Спасибо! – TBP