使用data.table创建asia_region变量时缺失值赋值错误问题问询
问题原因
- 你当前数据集里的
country字段缺失值是空格字符串" ",并非R语言标准的NA值,%chin%运算符对不在目标国家列表里的空格字符串会返回FALSE,所以直接被原逻辑赋值为0 - 就算
country是标准NA值,%chin%对NA的判断结果也是FALSE,你原来的单分支判断没有单独处理缺失场景,自然不会返回预期的NA
解决方案
推荐用data.table原生的条件赋值+fifelse实现,性能远高于基础ifelse,有两种可选写法:
方案1(推荐:先规范缺失值,后续处理更方便)
先把country中的空格统一转为标准NA,再按规则赋值:
library(data.table) # 原数据集 x_dt <- data.table(sexn = c(1, 0, 0, 1, NA, 1, NA), country = c("CHN", "JPN", "BGR", "AUT", " ", "TWN", " "), age = c(35, NA, 40, NA, 70, 18, 36) ) # 第一步:将country字段的空字符串转为标准NA x_dt[country == " ", country := NA_character_] # 第二步:按规则生成asia_region,仅对非缺失的country行赋值 x_dt[!is.na(country), asia_region := fifelse(country %chin% c("CHN", "JPN", "KOR", "SGP", "TWN"), 1, 0)]
方案2(不修改原country字段)
直接嵌套判断处理空格场景:
x_dt[, asia_region := fifelse( country %in% c(" ", NA_character_), NA_integer_, fifelse(country %chin% c("CHN", "JPN", "KOR", "SGP", "TWN"), 1, 0) )]
结果验证
处理后x_dt的asia_region取值为:1,1,0,0,NA,1,NA,符合预期要求。
内容的提问来源于stack exchange,提问作者MKro
相关产品推荐
相关产品推荐

