【问题标题】:R data.table summary function suffix or prefixR data.table 汇总函数后缀或前缀
【发布时间】:2018-05-24 15:55:09
【问题描述】:

我真的很欣赏 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 做同样的事情吗?通过不同的汇总函数汇总所有数字列并在输出中添加正确的后缀?

【问题讨论】:

  • 对于前缀,您可以像在base R中一样使用iris_dt[, c(m = lapply(.SD, mean)), .SDcols = cols],对于后缀,data.frame(c(x = iris)),我猜您需要使用setnames,也许围绕操作编写一个辅助函数。 (使用 setnames 而不是 setNames,因为前者通过引用修改名称)

标签: r dplyr data.table


【解决方案1】:

扩展弗兰克的评论,如果可以使用前缀而不是后缀的列名,您可以这样做:

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 似乎是多余的。

【讨论】:

    猜你喜欢
    • 2023-01-13
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2012-11-25
    • 2014-04-30
    相关资源
    最近更新 更多