首页 文章

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

提问于
浏览
0

我非常欣赏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 回答

  • 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
    

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

相关问题