这个问题与在一个函数调用中向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)