R语言使用lapply批量重编码列表内数据框变量结果异常
问题原因
R函数的返回值默认是函数体内最后一行表达式的执行结果。你之前写的匿名函数最后一行是赋值语句i[,'y1_new'] = ifelse(i[,'y1'] == 1, 1, 0),赋值操作的返回值是等号右侧的计算结果(也就是单独的y1_new向量),并非修改后的完整数据框,因此lapply会将列表中每个原始数据框替换为这个单独向量,最终导致原始数据列全部丢失。
修正方案
写法1:完全匹配原有ifelse逻辑
在匿名函数末尾显式返回修改后的完整数据框即可,代码兼容所有R版本:
full_list$imputations <- lapply(full_list$imputations, function(df) { df$y1_new <- ifelse(df$y1 == 1, 1, 0) df })
写法2:更高性能的简化写法
你的重编码逻辑本质是将「y1取值等于1」的布尔判断结果转换为0/1数值,无需调用ifelse,直接转换整数类型的执行效率更高,在数据量大的场景下优势明显:
full_list$imputations <- lapply(full_list$imputations, function(df) { df$y1_new <- as.integer(df$y1 == 1) df })
运行上述代码后查看对象结构,可看到imputations下的所有数据框均保留了原有y1、y2、y3列,同时正确新增了重编码后的y1_new列,不会出现数据丢失问题。
内容的提问来源于stack exchange,提问作者Damon C. Roberts
相关产品推荐
相关产品推荐

