使用lapply(.SD,…)计算多个聚合
发布时间:2020-12-14 05:00:19 所属栏目:百科 来源:网络整理
导读:我想使用data.table的lapply(.SD,…)方法执行多个聚合,即计算几个变量的几个不同的汇总统计信息.但我的猜测是如何以错误或相当于rbind而不是cbind的方式结束. 例如,要通过cyl获得mtcars的平均值和中位数mpg,可以执行以下操作: mtcars.dt - data.table(mtcar
我想使用data.table的lapply(.SD,…)方法执行多个聚合,即计算几个变量的几个不同的汇总统计信息.但我的猜测是如何以错误或相当于rbind而不是cbind的方式结束.
例如,要通过cyl获得mtcars的平均值和中位数mpg,可以执行以下操作: mtcars.dt <- data.table(mtcars) mtcars.dt[,list(mpg.mean = mean(mpg),mpg.median = median(mpg)),by = "cyl"] # Result: cyl mpg.mean mpg.median |1: 6 19.74 19.7 |2: 4 26.66 26.0 |3: 8 15.10 15.2 但是应用.SD方法可以解决这些问题: mtcars.dt[,lapply(.SD,function(x) list(mean(x),median(x))),by = "cyl",.SDcols = c("mpg")] # Result: cyl mpg 1: 6 19.7428571428571 2: 6 19.7 3: 4 26.6636363636364 4: 4 26 5: 8 15.1 6: 8 15.2 或完全打破: mtcars.dt[,list(mean,median)),.SDcols = c("mpg")] # Result: Error in `[.data.table`(mtcars.dt,: attempt to apply non-function 编辑:正如Senor O所说,一些答案为我的例子提供了工作,但仅仅因为有一个聚合列.理想的解决方案适用于多列,例如替换以下内容: mtcars.dt[,mpg.median = median(mpg),hp.mean = mean(hp),hp.median = median(hp)),by = "cyl"] # Result: cyl mpg.mean mpg.median hp.mean hp.median 1: 6 19.74 19.7 122.29 110.0 2: 4 26.66 26.0 82.64 91.0 3: 8 15.10 15.2 209.21 192.5 但是,即使它适用于单个列,它仍然有用.例如,我的直接用例是一个函数,它将列名作为字符串并为其计算多个分组指标,这是没有.SDcols AFAIK的情况下无法实现的. 解决方法
你错过了[[1]]或$mpg:
mtcars.dt[,median(x)))[[1]],by="cyl",.SDcols=c("mpg")] #or mtcars.dt[,median(x)))$mpg,.SDcols=c("mpg")] # cyl V1 V2 #1: 6 19.74286 19.7 #2: 4 26.66364 26.0 #3: 8 15.10000 15.2 对于更一般的情况,请尝试: mtcars.dt[,as.list(unlist(lapply(.SD,function(x) list(mean=mean(x),median=median(x))))),.SDcols=c("mpg","hp")] # cyl mpg.mean mpg.median hp.mean hp.median # 1: 6 19.74 19.7 122.29 110.0 # 2: 4 26.66 26.0 82.64 91.0 # 3: 8 15.10 15.2 209.21 192.5 (或as.list(sapply(.SD,…))) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |