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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:00:00