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

如何在循环中结合paste0执行data.table的分组取最后行操作?

问题分析

你当前代码的核心错误在于第二行assign语句中:paste0("dc_clean", i)[, .SD[.N], by="id_call"]里的paste0("dc_clean", i)返回的是字符串(比如"dc_clean202211"),而非实际的data.table对象,自然无法执行data.table的语法操作。


解决方案

方案1:修正原循环逻辑

先读取文件到临时变量,完成data.table处理后再赋值到全局环境:

library(data.table)

file_list <- c(202211,202210,202209,202208,202207,202206,202205,202204,202203,202202,202201,202112)
for (i in file_list){
  # 读取文件到临时变量
  temp_dt <- readRDS(paste0("data/dc_clean", i , ".RDS"))
  # 执行data.table去重操作(保留每个id_call的最后一行)
  temp_dt <- temp_dt[, .SD[.N], by = "id_call"]
  # 将处理后的结果赋值到全局环境
  assign(paste0("dc_clean", i), temp_dt)
}

方案2:推荐用列表统一管理(更规范高效)

不建议用assign生成大量独立对象,用列表管理所有处理后的data.table会更整洁,后续批量操作也更方便:

library(data.table)

file_list <- c(202211,202210,202209,202208,202207,202206,202205,202204,202203,202202,202201,202112)
# 生成所有文件的完整路径
file_paths <- paste0("data/dc_clean", file_list, ".RDS")

# 批量读取并处理,结果存储在列表中
dt_list <- lapply(file_paths, function(path) {
  dt <- readRDS(path)
  dt[, .SD[.N], by = "id_call"]
})

# 给列表元素命名,方便按名称调用
names(dt_list) <- paste0("dc_clean", file_list)

# 若确实需要将列表元素放到全局环境(不推荐),可执行:
# list2env(dt_list, envir = .GlobalEnv)

内容的提问来源于stack exchange,提问作者C.Tom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:55:39