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

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

代码说明

  1. as.character(df$col2):把混合类型的col2统一转为字符型,避免类型处理冲突;
  2. 正则匹配:\\d+用于匹配连续的数字序列,提取第一个匹配结果(无匹配则返回NA);
  3. as.numeric(...):将提取到的数字字符串转为数值类型,NA值自动保留。

该方案完全覆盖所有需求:原有数值保留、NA不变、纯文本转NA、混合文本中的数字精准提取。

内容的提问来源于stack exchange,提问作者zhd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:20:54