R语言data.table多列按列求和的简化实现方法问询
关于.()的说明
在data.table中,.()是list()的语法糖(别名),用来在j参数中构造返回的结果结构——因为data.table要求j返回列表时,会自动将其转换为data.table格式,这也是你当前代码能得到预期结果的核心原因。
更简洁的多列求和实现方式
1. 利用.SD+lapply批量处理指定列
.SD代表Subset of Data(数据子集),结合.SDcols指定要计算的列,用lapply对每列批量应用sum函数,无需重复编写sum():
# 指定具体列名 DT[, lapply(.SD, sum), .SDcols = c("t1", "t2", "a1", "a2")]
如果目标列有命名规律(比如都是t/a开头),还可以用patterns()匹配列名,省去逐个输入列名的麻烦:
# 匹配所有以t或a开头的列 DT[, lapply(.SD, sum), .SDcols = patterns("^t|^a")]
运行结果:
t1 t2 a1 a2 1: 70 14 98 32
2. 自动生成带sum前缀的列名
如果需要保留你原来的sumt1/sumt2这类命名格式,可以用setNames自动生成列名:
DT[, setNames(lapply(.SD, sum), paste0("sum", names(.SD))), .SDcols = c("t1", "t2", "a1", "a2")]
运行结果和你当前代码完全一致:
sumt1 sumt2 suma1 suma2 1: 70 14 98 32
3. 借助colSums快速计算
因为data.table继承自data.frame,所以可以直接用基础包的colSums函数;若要转为data.table格式,只需转置后再转换:
as.data.table(t(colSums(DT[, c("t1", "t2", "a1", "a2")])))
运行结果:
t1 t2 a1 a2 1: 70 14 98 32
内容的提问来源于stack exchange,提问作者Zentaur
相关产品推荐
相关产品推荐

