如何简化R中data.table分组批量列运算的代码?
在data.table中批量分组聚合多列的简洁实现
你遇到的问题核心是:直接用字符向量传入lapply时,没有正确引用数据框的列,导致sum函数处理的是字符串而非列值。下面是两种基于cols向量的简洁正确写法:
方法1:使用.SD和.SDcols(推荐最简洁)
这是data.table原生支持的批量处理多列的方式,.SD代表当前分组的子数据集,.SDcols指定要处理的列:
library(data.table) df <- data.table(a = c(1, 1, 2, 2), b = c(2, 4, 6, 6), c = c(1, 3, 7, 10), d = c(1, 5, 1, 5) ) cols = c('b', 'c', 'd') # 正确实现 output <- df[, lapply(.SD, sum, na.rm = TRUE), by = a, .SDcols = cols]
方法2:用get()引用字符列名
如果需要手动处理列名,可以用get()函数把字符列名转为对应的列数据,再用setNames保证输出列名正确:
output <- df[, setNames(lapply(cols, function(x) sum(get(x), na.rm = TRUE)), cols), by = a]
错误原因说明
你的output_fail写法错误在于:lapply(cols, function(x) sum(x, na.rm = TRUE))里的x是字符串(比如"b"),sum(x)实际是对字符串求和,而不是对df$b列求和,自然得不到正确结果。
内容的提问来源于stack exchange,提问作者Sam Asin
相关产品推荐
相关产品推荐

