0

リストのリストを処理したいと思います。具体的には、グループ化変数 (各リストの最初のメンバー) によって各リストの 3 番目のメンバーであるデータフレームを抽出し、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. これは非常に扱いにくいと感じます。これを行うためのより効率的な方法はありますか?

4

1 に答える 1

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   
于 2016-11-18T22:49:31.853 に答える