如何从生成列表的函数中获取多列结果

时间:2013-06-01 14:38:47

标签: r data.table

这个问题与Add multiple columns to R data.table in one function call?

相似但不完全相同

假设我有一个data.table

ex<-data.table(AAA=runif(100000),BBBB=runif(100000),CCC=runif(100000),DDD=runif(100000),EEE=runif(100000),FFF=runif(100000),HHH=runif(100000),III=runif(100000),FLAG=c(rep(c("a","b","c","d","e"),200000)))

我可以通过

获取所有列的总和和平均值
ex[,c(sum=lapply(.SD,sum),mean=lapply(.SD,mean)),by=FLAG]

结果看起来很好,我在J中指定的名称附加到现有的列名称,以便于识别,FLAG的每个值只有1行,如预期的那样。

但是,假设我有一个返回列表的函数,例如

sk<-function(x){
  meanx<-mean(x)
  lenx<-length(x)
  difxmean<-x-meanx
  m4<-sum((difxmean)^4)/lenx
  m3<-sum((difxmean)^3)/lenx
  m2<-sum((difxmean)^2)/lenx
  list(mean=meanx,len=lenx,sd=m2^.5,skew=m3/m2^(3/2),kurt=(m4/m2^2)-3)
}

如果我这样做

ex[,lapply(.SD,sk),by=FLAG]

我为列表的每个输出得到一行结果。我想仍然只有一行结果,其中包含每个原始列和函数结果的列。

例如,输出列应为

AAA.mean    AAA.len     AAA.sd     AAA.skew    AAA.kurt       BBBB.mean    BBBB.len     BBBB.sd     BBBB.skew    BBBB.kurt    ....    III.mean    III.len     III.sd     III.skew    III.kurt

有办法做到这一点吗?

我知道我可以将所有这些单独的函数放在J中并获取列但我发现当我使用此函数而不是单独的函数时,它会更快一些。

x<-runif(10000000)
system.time({
mean(x)
length(x)
sd(x)
skewness(x)
kurtosis(x)
})
user  system elapsed 
5.84    0.47    6.30

system.time(sk(x))
user  system elapsed 
3.9     0.1     4.0 

1 个答案:

答案 0 :(得分:5)

试试这个:

ex[, as.list(unlist(lapply(.SD, sk))), by = FLAG]