如何在R的data.table中对变量应用匿名函数?
解决data.table指定值替换为NA的问题
可复现代码
library(data.table) # 创建示例data.table dt1 <- data.table(age_at_fy_start = c(25, -1, 30, 99), age_at_fy_end = c(26, 31, -1, 99)) dt2 <- data.table(age_at_fy_start = c(40, 99, -1, 50), age_at_fy_end = c(41, 51, 99, -1)) # 多个表存入列表 dt_list <- list(dt1, dt2)
正确实现方法
单个表处理
使用.SDcols锁定目标列,结合fifelse(data.table高效条件函数)完成替换:
# 处理单个data.table dt1[, (c("age_at_fy_start", "age_at_fy_end")) := lapply(.SD, function(x) fifelse(x %in% c(-1, 99), NA_real_, x)), .SDcols = c("age_at_fy_start", "age_at_fy_end")]
也可以用base R的replace函数,效果一致:
dt1[, (c("age_at_fy_start", "age_at_fy_end")) := lapply(.SD, function(x) replace(x, x %in% c(-1, 99), NA)), .SDcols = c("age_at_fy_start", "age_at_fy_end")]
批量处理多个表
将多个data.table存入列表后,用lapply批量迭代处理:
# 批量更新列表中所有表 dt_list_updated <- lapply(dt_list, function(dt) { dt[, (c("age_at_fy_start", "age_at_fy_end")) := lapply(.SD, function(x) fifelse(x %in% c(-1, 99), NA_real_, x)), .SDcols = c("age_at_fy_start", "age_at_fy_end")] })
错误原因解析
- “:=的左操作数不是列名或位置”:通常是因为你错误地将
.SDcols写在:=左侧,或者左侧不是有效的列名/位置向量。正确写法是左侧放列名向量,.SDcols作为独立参数指定目标列。 - “提供2列却要分配4个项”:说明
:=右侧返回的元素数量与左侧列数不匹配。比如错误合并两个列的向量后处理,导致返回的是两倍于行数的元素,而非对应每列的处理结果。
内容的提问来源于stack exchange,提问作者sesnelson
相关产品推荐
相关产品推荐

