我非常欣赏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做同样的事情吗?通过不同的汇总函数汇总所有数字列,并为输出添加正确的后缀?
答案 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
)似乎是多余的。