首页 > 解决方案 > 在 data.table 中使用带有 .SD 的其他列

问题描述

我正在尝试将 .SD 与汇总操作中的其他一些列结合起来,但这会导致结果不正确(为了我的目标)。对于(一个愚蠢的)例子:

library(data.table)

t <- as.data.table(mtcars)

t[, list(cyl = sum(cyl), lapply(.SD, mean)), .SDcols = c('mpg', 'disp')]

我希望它返回一个具有 1 行和 3 列的 data.table,但它返回的是一个具有 2 行和 2 列的列。有没有解决的办法?

标签: rdata.table

解决方案


问题是list(cyl, lapply(.))返回的东西不是真正的框架。如果您在data.table环境之外查看它,它看起来像:

str(list(cyl = sum(t$cyl), lapply(t[,c("mpg","disp")], mean)))
# List of 2
#  $ cyl: num 198
#  $    :List of 2
#   ..$ mpg : num 20.1
#   ..$ disp: num 231

当更好的回报看起来像这样时:

str(c(list(cyl = sum(t$cyl)), lapply(t[,c("mpg","disp")], mean)))
# List of 3
#  $ cyl : num 198
#  $ mpg : num 20.1
#  $ disp: num 231

相反,c连接两个列表:

t[, c(list(cyl = sum(cyl)), lapply(.SD, mean)), .SDcols = c('mpg', 'disp')]
#      cyl      mpg     disp
#    <num>    <num>    <num>
# 1:   198 20.09062 230.7219

或者只是将一个数字连接sum(cyl)lapply列表中(感谢 BrianMontgomery):

t[, c(cyl = sum(cyl), lapply(.SD, mean)), .SDcols = c('mpg', 'disp')]

推荐阅读