自定义R转换函数生成NA问题排查:带B/M字符转数值异常
问题原因与解决方法
你的函数出现NA的核心原因是**if语句是标量判断,而非矢量化操作**:str_contains(df_example, "B")返回的是逻辑向量[TRUE, TRUE, FALSE, FALSE, TRUE],但if只会取这个向量的第一个元素(TRUE),导致整个向量都进入了if分支——那些带"M"的元素会被尝试移除"B"(自然找不到,字符串里仍留着"M"),后续转数值时就会生成NA。
修正方案1:用矢量化的ifelse重写函数
library(stringr) converting_mio_bio <- function(x) { # 统一替换逗号为小数点 x_clean <- str_replace_all(x, ",", ".") # 分情况处理B/M后缀 ifelse(str_contains(x_clean, "B"), as.numeric(str_remove_all(x_clean, "B")) * 1000, as.numeric(str_remove_all(x_clean, "M"))) } # 测试 df_example <- c("5,14B", "7,4B", "65,12M", "992,3M", "1,2B") converting_mio_bio(df_example) # 输出结果:[1] 5140.0 7400.0 65.12 992.3 1200.0
修正方案2:用purrr逐元素处理(适合更复杂逻辑)
library(stringr) library(purrr) converting_mio_bio <- function(x) { map_dbl(x, function(item) { item_clean <- str_replace_all(item, ",", ".") if(str_contains(item_clean, "B")) { as.numeric(str_remove_all(item_clean, "B")) * 1000 } else { as.numeric(str_remove_all(item_clean, "M")) } }) } converting_mio_bio(df_example) # 输出结果:[1] 5140.0 7400.0 65.12 992.3 1200.0
内容的提问来源于stack exchange,提问作者Philipp Neuber
相关产品推荐
相关产品推荐

