data.table利用列名中年份字符串批量计算合计列的实现方法
实现方案
思路
通过正则提取列名中的年份后缀,动态生成计算规则和待删除列列表,全程使用data.table原地操作,适配大表场景,无需手动编写每个年份的处理逻辑。
代码实现
常规版本(列名拼写规范)
适用于LunchMoney_年份、DinnerMoney_年份命名完全正确的场景:
library(data.table) # 提取所有唯一年份后缀 year_list <- unique(sub(".*_(\\d{4})$", "\\1", names(money_table)[names(money_table) != "ID"])) # 生成新列计算逻辑 new_cols <- lapply(year_list, function(y) { parse(text = sprintf("LunchMoney_%s + DinnerMoney_%s", y, y)) }) names(new_cols) <- paste0("TotalMoney_", year_list) # 生成待删除旧列列表 old_cols <- unlist(lapply(year_list, function(y) { c(paste0("LunchMoney_", y), paste0("DinnerMoney_", y)) })) # 批量执行操作 money_table[, (names(new_cols)) := new_cols][, (old_cols) := NULL]
兼容版本(列名拼写有误差)
如果存在类似示例中DinnerMondey_1213、DinnerMondy_1314的拼写错误,只要后缀年份正确,可使用该版本自动匹配同一年份的两列求和:
library(data.table) # 提取所有唯一年份后缀 year_list <- unique(sub(".*_(\\d{4})$", "\\1", names(money_table)[names(money_table) != "ID"])) # 自动匹配同一年份的所有金额列生成计算逻辑 new_cols <- lapply(year_list, function(y) { match_cols <- grep(paste0("_", y, "$"), names(money_table), value = T) parse(text = paste(match_cols, collapse = " + ")) }) names(new_cols) <- paste0("TotalMoney_", year_list) # 生成待删除旧列列表 old_cols <- unlist(lapply(year_list, function(y) { grep(paste0("_", y, "$"), names(money_table), value = T) })) # 批量执行操作 money_table[, (names(new_cols)) := new_cols][, (old_cols) := NULL]
说明
- 所有操作均为data.table原地修改,无额外内存拷贝,适合处理超大数据表
- 可自动适配任意数量的年份列,无需修改代码逻辑
内容的提问来源于stack exchange,提问作者rw2
相关产品推荐
相关产品推荐

