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

Dea*_*gor 4 r data.table

这个问题与在一个函数调用中向R data.table添加多个列类似但不完全相同

假设我有一个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)))
Run Code Online (Sandbox Code Playgroud)

我可以通过这样做获得所有列的总和和平均值

ex[,c(sum=lapply(.SD,sum),mean=lapply(.SD,mean)),by=FLAG]
Run Code Online (Sandbox Code Playgroud)

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

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

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)
}
Run Code Online (Sandbox Code Playgroud)

如果我做

ex[,lapply(.SD,sk),by=FLAG]
Run Code Online (Sandbox Code Playgroud)

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

例如,输出列应该是

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
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

我知道我可以将所有这些单独的函数放在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 
Run Code Online (Sandbox Code Playgroud)

G. *_*eck 5

试试这个:

ex[, as.list(unlist(lapply(.SD, sk))), by = FLAG]
Run Code Online (Sandbox Code Playgroud)