在 data.table 中使用带有 .SD 的其他列

Use other columns with .SD in data.table

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

library(data.table)

t <- as.data.table(mtcars)

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

我希望 return 具有 1 行和 3 列的 data.table,但它 return 是具有 2 行和 2 列的列。有解决办法吗?

问题是 list(cyl, lapply(.)) 正在 returning 一些不是真正框架的东西。如果你在 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

当更好的 return 看起来像:

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')]

使用append

setnames(t[,  append(sum(cyl), lapply(.SD, mean)), .SDcols = c('mpg', 'disp')], 1, 'cyl')[]
   cyl      mpg     disp
1: 198 20.09062 230.7219