R语言:如何从含数字、文本、NA的col2列提取数值?
从混合类型列中提取数值的R解决方案
需要处理包含数值、文本、NA的混合列col2,实现以下目标:
- 保留原有数值类型的数字
- 保留NA值
- 纯文本转为NA
- 从混合文本中提取数字(如
'data >20 mile/h'提取为20)
原始数据:
col1 <- c('t1', 't2', 't3', 't4', 't5', 't6', 't7', 't8', 't9', 't10') col2 <- c(300, '>200m', NA, 'result 50 mg/g', NA, 'Not data', 'pending', NA, 'positive', 'data >20 mile/h') df <- data.frame(col1, col2)
期望输出的col3:
col3 <- c(300, 200, NA, 50, NA, NA, NA, NA, NA, 20) df2 <- data.frame(col1, col3)
方法1:使用stringr包(简洁直观)
# 未安装包先运行:install.packages("stringr") library(stringr) # 生成目标列col3 df$col3 <- as.numeric(str_extract(as.character(df$col2), "\\d+"))
方法2:使用Base R(无需额外依赖)
# 生成目标列col3 df$col3 <- as.numeric(sapply(as.character(df$col2), function(x) { num_matches <- regmatches(x, gregexpr("\\d+", x))[[1]] if (length(num_matches) > 0) num_matches[1] else NA }))
结果验证
运行代码后,df$col3将与期望输出完全一致:
> df$col3 [1] 300 200 NA 50 NA NA NA NA NA 20
代码说明
as.character(df$col2):把混合类型的col2统一转为字符型,避免类型处理冲突;- 正则匹配:
\\d+用于匹配连续的数字序列,提取第一个匹配结果(无匹配则返回NA); as.numeric(...):将提取到的数字字符串转为数值类型,NA值自动保留。
该方案完全覆盖所有需求:原有数值保留、NA不变、纯文本转NA、混合文本中的数字精准提取。
内容的提问来源于stack exchange,提问作者zhd
相关产品推荐
相关产品推荐

