【问题标题】:Use other columns with .SD in data.table在 data.table 中使用带有 .SD 的其他列
【发布时间】:2021-12-10 11:57:58
【问题描述】:

我正在尝试在汇总操作中将 .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 列的列。有没有办法解决这个问题?

【问题讨论】:

  • 请花点时间学习文档和?data.table.SD 中的大量示例。在那里你会发现:DT[, c(.N, lapply(.SD, sum)), by=x]; DT[, c(.(y=max(y)), lapply(.SD, min)), by=rleid(v), .SDcols=v:b]。干杯

标签: r data.table


【解决方案1】:

问题是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

取而代之的是concatenate 两个列表:

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

【讨论】:

  • 或者只是 t[, c(cyl = sum(cyl), lapply(.SD, mean)), .SDcols = c('mpg', 'disp')]
【解决方案2】:

使用append

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多