将含百分比、小数及NA的字符列统一转换为小数格式
解决方案
错误原因分析
你遇到的报错是因为case_when要求所有分支返回相同类型的数据:
is.na(value) ~ NA返回的是逻辑型NA- 处理百分比的分支返回数值型
.default = value返回原字符型
三种类型不匹配导致报错,同时原代码未将字符型小数转为数值型,最终结果也不符合要求。
修复后的case_when写法
调整分支顺序,统一返回数值型,同时将字符小数转为数值:
library(dplyr) library(stringr) df <- df %>% mutate(value = case_when( grepl("%", value, fixed = TRUE) ~ as.numeric(str_remove(value, "%")) / 100, !is.na(value) ~ as.numeric(value), .default = NA_real_ # 明确指定数值型NA ))
更简洁的实现方式
不需要case_when,可以通过两步操作完成:
df <- df %>% mutate( # 标记原本带%的行 has_percent = grepl("%", value, fixed = TRUE), # 移除%并转为数值 value = as.numeric(gsub("%", "", value)), # 带%的数值除以100,其余保持不变 value = ifelse(has_percent, value / 100, value), # 移除临时辅助列(可选) has_percent = NULL )
或者用一行代码简化:
df <- df %>% mutate(value = as.numeric(gsub("%", "", value)) * ifelse(grepl("%", value, fixed = TRUE), 0.01, 1))
验证结果
运行上述代码后,数据框会转为目标格式:
| value |
|---|
| 0.15 |
| 0.205 |
| NA |
| 0.17 |
| 0.356 |
内容的提问来源于stack exchange,提问作者lisboakotor
相关产品推荐
相关产品推荐

