R data.table汇总函数后缀或前缀

时间:2018-05-24 15:55:10

标签: r dplyr data.table

我非常欣赏data.table包的速度,但我还没弄清楚如何为汇总函数添加后缀。 dplyr软件包完美地开箱即用,我希望它可以在data.table中使用。这是一个可重复的例子。

library(data.table)
library(datasets)
library(dplyr)

data(iris)
iris_dt = as.data.table(iris)

#Using dplyr

summary_stats <- iris %>% 
  group_by(Species) %>% 
  summarise_all(funs(mean(., na.rm = TRUE),sd(.,na.rm=TRUE)))

#Using data table
cols = sapply(iris_dt, is.numeric)
iris_dt[, lapply(.SD, mean), .SDcols = cols]

 names(summary_stats)
[1] "Species"           "Sepal.Length_mean" "Sepal.Width_mean"  "Petal.Length_mean" "Petal.Width_mean"  "Sepal.Length_sd"  
[7] "Sepal.Width_sd"    "Petal.Length_sd"   "Petal.Width_sd"   
 names(iris_dt)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     

如您所见,使用dplyr和多个汇总函数,会自动添加后缀。这对我来说非常有用,但在较大的数据集上它很慢。

我们可以用data.table做同样的事情吗?通过不同的汇总函数汇总所有数字列,并为输出添加正确的后缀?

1 个答案:

答案 0 :(得分:1)

扩展Frank的评论,如果列名前缀而不是后缀可以,你可以这样做:

my_funs <- c(mean = function(x) mean(x, na.rm = TRUE),
             sd = function(x) sd(x, na.rm = TRUE))

iris_dt[
  ,
  do.call(c, lapply(my_funs, function(fun) lapply(.SD, fun))),
  by = Species,
  .SDcols = cols # superfluous here
  ]

#       Species mean.Sepal.Length mean.Sepal.Width mean.Petal.Length mean.Petal.Width
# 1:     setosa             5.006            3.428             1.462            0.246
# 2: versicolor             5.936            2.770             4.260            1.326
# 3:  virginica             6.588            2.974             5.552            2.026
#    sd.Sepal.Length sd.Sepal.Width sd.Petal.Length sd.Petal.Width
# 1:       0.3524897      0.3790644       0.1736640      0.1053856
# 2:       0.5161711      0.3137983       0.4699110      0.1977527
# 3:       0.6358796      0.3224966       0.5518947      0.2746501

note :在这种特殊情况下,由于除分组之外的所有列都是数字,因此定义cols并使用.SDcols)似乎是多余的。