在 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
我试图在汇总操作中将 .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