You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将含百分比、小数及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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 06:00:26