如何在R函数中为data.table创建带指定前缀的新变量
解决方法
问题原因
你之前的函数报错,是因为data.table的:=操作符左侧不能直接用paste0这类生成列名的表达式,必须把动态生成的列名放在括号()里,或者通过命名列表的方式传递。
方法1:修改函数,动态生成列名
调整函数,先构造列名字符串,再用括号包裹作为:=的左侧,这样就能生成带年份后缀的PAR列,不会被覆盖:
add_par_column <- function(dt, year) { col_name <- paste0("PAR", year) # 用括号包裹列名字符串,告诉data.table这是要创建的列名 dt[, (col_name) := cancer == 0 | (cancer == 1 & cancerDate >= paste0(year, "-01-01"))] return(dt) } # 循环调用处理所有年份 years <- 2015:2021 for(y in years) { DT <- add_par_column(DT, y) }
方法2:一次性生成所有列(更高效,避免重复代码)
不用循环调用函数,直接批量构建所有需要的PAR列,这是data.table推荐的高效写法:
years <- 2015:2021 # 构建每个年份对应的表达式和列名 par_cols <- lapply(years, function(y) { # 构造判断条件的表达式,转成Date类型更严谨 cond_expr <- substitute( cancer == 0 | (cancer == 1 & cancerDate >= start_date), list(start_date = as.Date(paste0(y, "-01-01"))) ) # 为表达式设置对应的列名 setNames(list(cond_expr), paste0("PAR", y)) }) # 将列表合并为一个命名列表,一次性添加所有列 DT[, c(names(unlist(par_cols))) := unlist(par_cols, recursive = FALSE)]
内容的提问来源于stack exchange,提问作者Temitope
相关产品推荐
相关产品推荐

