在R中如何定位tibble列内无法转换为numeric类型的元素
解决方案
优先使用tidyverse语法的话,可以直接通过dplyr::filter()结合类型转换的结果筛选异常行,核心逻辑是:字符串转数值后为NA、且原字符串不是合法的缺失值标记(如"NA")的行,就是转换失败的行。
最简写法
无需修改原表结构,直接筛选得到结果:
library(tidyverse) tibble(x = 1:10, y = c("11", "12", "13", "14", "15", "16", "17", "18-21", "22", "23")) %>% filter(is.na(suppressWarnings(as.numeric(y))) & y != "NA")
运行后输出符合预期的结果:
# A tibble: 1 × 2 x y <int> <chr> 1 8 18-21
这里用suppressWarnings()包裹as.numeric()是为了避免筛选时触发"NAs introduced by coercion"的警告,不需要可以去掉。
带校验的写法
如果需要同时查看转换后的值做二次确认,可以新增临时列再筛选:
tibble(x = 1:10, y = c("11", "12", "13", "14", "15", "16", "17", "18-21", "22", "23")) %>% mutate(y_num = suppressWarnings(as.numeric(y))) %>% filter(is.na(y_num) & y != "NA")
如果你的场景中除了"NA"之外还有其他需要视为合法缺失值的字符串(比如空字符串""、"NULL"等),只需要在filter的判断条件中补充排除即可。
内容的提问来源于stack exchange,提问作者Freddie J. Heather
相关产品推荐
相关产品推荐

