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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 20:33:38