带缺失值(NA)的数值变量转换与取整报错问题咨询
问题分析:Excel导入数据集的数值转换与取整错误
问题场景
处理从Excel导入的数据集fab_2023,需将Total_score_2023到MA_Combined_Social_2021的变量转为数值格式(含缺失值NA)并保留两位小数,执行代码如下:
fab_2023 <- fab_2023 %>% mutate_at(vars(Total_score_2023:MA_Combined_Social_2021), ~ ifelse(is.na(.), NA, as.numeric(.))) fab_2023 <- fab_2023 %>% mutate_at(vars(Total_score_2023:MA_Combined_Social_2021), ~ ifelse(is.na(.), NA, round(., 2)))
错误信息
Error in `mutate()`: ! Problem while computing `Total_score_2021 = (structure(function (..., .x = ..1, .y = ..2, . = ..1) ...`. Caused by error in `round()`: ! non-numeric argument to mathematical function Run `rlang::last_error()` to see where the error occurred.
问题根源
ifelse的类型强制问题:
当原变量为字符型时,ifelse(is.na(.), NA, as.numeric(.))中,逻辑型的NA和数值型的转换结果会被ifelse强制统一为逻辑型向量,导致后续round函数接收到非数值参数,触发报错。冗余的缺失值判断:
as.numeric本身可直接将字符型的"NA"或原生NA转换为数值型NA,无需额外用ifelse做判断。语法过时:
tidyverse已弃用mutate_at,推荐使用更灵活的mutate(across(...))语法,旧语法可能存在隐性兼容性问题。
修正方案
使用现代tidyverse语法,合并转换与取整步骤,直接处理数值转换和缺失值:
fab_2023 <- fab_2023 %>% mutate(across(vars(Total_score_2023:MA_Combined_Social_2021), ~ round(as.numeric(.), 2)))
补充说明
如果转换时出现"引入了NA"的警告,说明原变量中存在无法直接转换为数值的非数字内容(如逗号、百分号、文字注释),需先清理再转换,示例如下:
# 清理百分号并转换为小数 fab_2023 <- fab_2023 %>% mutate(across(vars(Total_score_2023:MA_Combined_Social_2021), ~ round(as.numeric(str_remove(., "%"))/100, 2)))
内容的提问来源于stack exchange,提问作者e. erhan
相关产品推荐
相关产品推荐

