如何使用ifelse()等方法修正R数据集特定行的性别、年龄字段错误
数据集错误修复方案
第一步:修复gender和age字段错位问题
先定位满足gender == "21"且is.na(age)的行,互换两个字段的取值即可:
# base R 实现 # 定位错位行 misplaced_rows <- d$gender == "21" & is.na(d$age) # 临时存储原age值 temp_age <- d$age[misplaced_rows] # 给age赋正确的数值 d$age[misplaced_rows] <- as.integer(d$gender[misplaced_rows]) # 给gender赋正确的取值 d$gender[misplaced_rows] <- as.character(temp_age)
如果习惯用dplyr语法,也可以用以下写法:
library(dplyr) d <- d %>% mutate( age = ifelse(gender == "21" & is.na(age), as.integer(gender), age), gender = ifelse(gender == "21" & is.na(age), as.character(age), gender) )
第二步:标准化gender字段取值
方法1:用ifelse()函数实现(符合你的需求)
借助grepl()模糊匹配开头字符,开启不区分大小写适配大小写不同的取值:
d$gender <- ifelse(grepl("^k", d$gender, ignore.case = TRUE), "F", ifelse(grepl("^m", d$gender, ignore.case = TRUE), "M", d$gender))
说明:^k表示匹配以k开头的字符串,ignore.case = TRUE会同时匹配大写K和小写k的情况,原本已经是F/M的合法取值会保留不变。
方法2:用case_when()实现(可读性更高,适配更复杂的规则扩展)
d <- d %>% mutate(gender = case_when( grepl("^k", gender, ignore.case = TRUE) ~ "F", grepl("^m", gender, ignore.case = TRUE) ~ "M", .default = gender ))
结果验证
运行以下代码确认修复效果:
unique(d$gender) unique(d$age)
注:你提供的示例数据中age字段统一设为37、无NA值,错位修复逻辑是适配你描述的真实数据场景,测试时可自行调整示例数据的age取值验证逻辑有效性。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

