You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R data.table:结合lapply分组聚合时自定义.N列名称

解决data.table分组聚合时自定义.N列名的问题

首先给出原始数据和定义的列向量:

library(data.table)
dt <- data.table(
  ID = c("b","b","b","a","a","c"),
  x = 1:6,
  y = 7:12,
  z = 13:18
)
cols <- c("x", "y")

要实现分组计算x、y的均值,同时将.N对应的列名改为Members,且在聚合语句内完成,以下是两种可行的正确写法:

方法一:合并命名列表(适配动态列场景)

将.N包装进命名列表,再与lapply(.SD, mean)的结果合并,这样能保留自定义列名:

dt[, c(lapply(.SD, mean), list(Members = .N)), .SDcols = cols, keyby = "ID"]

执行后结果如下:

ID x  y Members
1:  a 4 10       2
2:  b 2  8       3
3:  c 6 12       1

方法二:直接构造结果列(适合列固定的场景)

如果列名是固定的,也可以直接在.()里定义所有列:

dt[, .(x = mean(x), y = mean(y), Members = .N), keyby = "ID"]

解释之前尝试失败的原因

  • 第一种尝试dt[, c(lapply(.SD, mean), Members = .N), .SDcols=cols, keyby = "ID"]失败:
    直接在c()里写Members = .N时,.N作为data.table的特殊变量,会被自动命名为N,而非保留自定义的Members。必须将.N放入list(Members = .N)中,才能让自定义列名生效。

  • 第二种尝试dt[, (c(cols, "Members")) = c(lapply(.SD, mean), .N), .SDcols=cols, keyby = "ID"]失败:
    这种写法混淆了data.table的聚合语法与更新语法。聚合操作的j参数需要返回列表或data.table,而非用=直接赋值列名,因此触发语法错误。

内容的提问来源于stack exchange,提问作者gabagool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 02:35:11