如何在循环中结合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
相关产品推荐
相关产品推荐

