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
相关产品推荐
相关产品推荐

