R语言清理薪资数据:无K值行生成NA问题求助
问题原因
你遇到的NA是因为不含"K"的薪资字符串里包含千分位逗号(比如45,360),直接用as.numeric()无法解析带逗号的字符串,导致强制转换时生成NA。
解决方案
方案1:使用readr::parse_number(推荐)
parse_number可以自动忽略字符串中的逗号、字母等非数字字符,直接提取数值,再根据是否含"K"决定是否乘以1000:
library(dplyr) library(readr) yearly %>% mutate( min_salary = case_when( str_detect(min_salary, "K") ~ parse_number(min_salary) * 1000, TRUE ~ parse_number(min_salary) ), max_salary = case_when( str_detect(max_salary, "K") ~ parse_number(max_salary) * 1000, TRUE ~ parse_number(max_salary) ) )
方案2:手动处理逗号(不依赖额外包)
先去掉字符串中的逗号,再进行转换:
library(dplyr) yearly %>% mutate( min_salary = case_when( str_detect(min_salary, "K") ~ as.numeric(gsub("[^0-9.]", "", min_salary)) * 1000, TRUE ~ as.numeric(gsub(",", "", min_salary)) ), max_salary = case_when( str_detect(max_salary, "K") ~ as.numeric(gsub("[^0-9.]", "", max_salary)) * 1000, TRUE ~ as.numeric(gsub(",", "", max_salary)) ) )
更简洁的批量处理写法
用across函数批量处理min_salary和max_salary两列,避免重复代码:
library(dplyr) library(readr) yearly %>% mutate(across(c(min_salary, max_salary), ~ case_when( str_detect(.x, "K") ~ parse_number(.x) * 1000, TRUE ~ parse_number(.x) )))
内容的提问来源于stack exchange,提问作者moonyoung hwang
相关产品推荐
相关产品推荐

