R语言遍历data.table修改特定条件值的函数实现问题
问题根因
你原来的代码存在3个核心错误:
- 多余的嵌套循环:外层遍历列名、内层又遍历所有列数值,逻辑重复混乱
- return位置错误:return放在了第一层循环内部,导致仅处理完第一列就直接返回,后续c、d列不会被处理
- 动态列名赋值语法错误:
:=中直接写i = NA会被data.table识别为新增名为i的列,而非赋值给变量i对应的列,需要用语法明确告知为动态变量。
修改后可用函数
checkDT <- function(dt, cutoff){ columns <- c('b','c','d') for (col in columns){ col_vals <- dt[[col]] # 计算当前列首个大于cutoff的数值 first_gt <- min(col_vals[col_vals > cutoff], na.rm = TRUE) if(!is.infinite(first_gt)){ # 动态列名赋值:get(col)取列值做判断,(col)表示是变量列名而非字面量 dt[get(col) > first_gt, (col) := NA] } } return(dt) }
验证测试
用你提供的样例数据测试:
# 样例数据 dt <- structure(list(a = structure(c(18517, 18524, 18531, 18538, 18545, 18552, 18559, 18566, 18573, 18580, 18587), class = "Date"), b = c(14L, 16L, 18L, 21L, 23L, 26L, 29L, 32L, 35L, 39L, 42L), c = c(9L, 10L, 12L, 14L, 16L, 18L, 21L, 23L, 26L, 29L, 32L), d = c(4L, 5L, 6L, 8L, 9L, 11L, 13L, 16L, 18L, 20L, 23L)), row.names = c(NA, -11L), class = c("data.table", "data.frame")) cutoff <- 21 dt_processed <- checkDT(dt, cutoff) print(dt_processed)
输出完全符合预期:
a b c d 1: 2020-09-12 14 9 4 2: 2020-09-19 16 10 5 3: 2020-09-26 18 12 6 4: 2020-10-03 21 14 8 5: 2020-10-10 23 16 9 6: 2020-10-17 NA 18 11 7: 2020-10-24 NA 21 13 8: 2020-10-31 NA 23 16 9: 2020-11-07 NA NA 18 10: 2020-11-14 NA NA 20 11: 2020-11-21 NA NA 23
内容的提问来源于stack exchange,提问作者lagn91
相关产品推荐
相关产品推荐

