这个问题与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 中指定的名称附加到现有列名称以便于识别,每个 的值只有 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)
}
如果我做
ex[,lapply(.SD,sk),by=FLAG]
对于列表的每个输出,我都会得到一行结果。我希望仍然只有 1 行结果,每个原始列和函数结果都有列。
例如输出列应该是
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