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
相关产品推荐
相关产品推荐

