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

R语言技术问询:如何从Data Frame提取所有数字至向量及处理含重复值与NA的提取问题

嘿,我来帮你搞定这个提取数字的问题!

解决从DataFrame提取完整数字并转为无NA向量的问题

1. 先修正你遇到的单列提取问题

你现在得到单个数字(比如把35拆成3和5),核心原因是用了\\d这个正则——它只会匹配单个数字字符。要提取像35、20这种完整的连续数字,得把正则改成\\d+(加号表示匹配1个或多个连续的数字)。

修正后的单列处理代码:

library(stringr)

# 提取该列所有完整数字,转成数值向量并去掉NA
single_col_result <- as.numeric(unlist(str_extract_all(gt1$FGT, "\\d+")))
single_col_result <- single_col_result[!is.na(single_col_result)]

这样就能得到你想要的c(35, 20, 28...)形式的结果了。

2. 处理整个DataFrame的通用方案

如果要提取表格所有列里的数字,转成单个无NA的向量,有两种简洁的实现方式:

方法一:基础循环逐列处理

适合习惯基础R语法的场景:

library(stringr)

# 初始化空向量存结果
all_numbers <- c()

# 遍历每一列提取数字
for (col_name in colnames(gt1)) {
  # 提取当前列的所有完整数字并转数值
  col_numbers <- as.numeric(unlist(str_extract_all(gt1[[col_name]], "\\d+")))
  # 合并到总向量
  all_numbers <- c(all_numbers, col_numbers)
}

# 移除NA值
all_numbers <- all_numbers[!is.na(all_numbers)]

# 若需要去重,可添加这一行
all_numbers_unique <- unique(all_numbers)

方法二:用dplyr管道简化操作

适合喜欢简洁管道语法的场景:

library(dplyr)
library(stringr)

all_numbers <- gt1 %>%
  # 把所有列转成字符型,统一处理提取逻辑
  mutate(across(everything(), as.character)) %>%
  # 将整个表格拆成单个元素的向量
  unlist() %>%
  # 提取所有连续数字序列
  str_extract_all("\\d+") %>%
  unlist() %>%
  # 转成数值型
  as.numeric() %>%
  # 移除NA值
  na.omit() %>%
  # 转成普通向量(可选,消除na.omit带来的属性)
  as.vector()

# 去重的话加上unique()
all_numbers_unique <- unique(all_numbers)

额外提醒

如果你的表格里的数字本身就是数值型(不是嵌在字符串里的),那完全不需要用str_extract_all,直接用下面的代码更高效:

# 适用于数字本身是数值型的表格
all_numbers <- as.numeric(unlist(gt1))
all_numbers <- all_numbers[!is.na(all_numbers)]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 06:17:37