按组处理列表列表
Processing lists of lists by group
我想处理一个列表列表。具体来说,我想通过分组变量(每个列表的第一个成员)提取作为每个列表的第三个成员的数据框,然后使用多个函数,如 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. 感觉很笨重,有没有更高效的方法呢?
在基础 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
我想处理一个列表列表。具体来说,我想通过分组变量(每个列表的第一个成员)提取作为每个列表的第三个成员的数据框,然后使用多个函数,如 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. 感觉很笨重,有没有更高效的方法呢?
在基础 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