如何在RStudio中从含文本的列提取数字至新列?
解决方案:从文本字符串中提取数字到目标列
核心思路
利用正则表达式匹配字符串中的数字序列(适配纯数字、带符号或特殊符号包裹的数字场景),结合dplyr和stringr包实现精准提取,替换原有无法处理文本内容的ifelse逻辑。
基础场景实现(处理开头带数字的文本)
优化你现有代码的核心逻辑,直接在mutate中提取v1列的数字到v1.1:
library(dplyr) library(stringr) # 原始数据 df <- data.frame(v1=c("11 because of reason x","22 but I like this"), pages=c(32,45), name=c("spark","python")) # 简化复制列并生成空清洗列的逻辑 df2 <- df %>% mutate(across(everything(), ~ list(c(., NA))), .keep = "unused") %>% unnest_wider(everything(), names_sep = ".") %>% select(sort(names(.))) # 提取v1中的连续数字到v1.1 df2 <- df2 %>% mutate(v1.1 = str_extract(v1, "\\d+") %>% as.integer()) # 查看结果 df2
代码说明:
str_extract(v1, "\\d+"):用正则\\d+匹配字符串中第一组连续数字as.integer():将提取到的文本格式数字转为整数类型
复杂格式处理(适配带特殊符号/正负号的数字)
针对"(5+6)I think"、"-123 error"这类特殊格式,调整正则规则即可覆盖:
提取单个带符号数字
# 含复杂格式的示例数据 df_complex <- data.frame(v1=c("(5+6)I think", "-123 because of error", "+45 but okay"), pages=c(32,45,67), name=c("spark","python","r")) df_complex2 <- df_complex %>% mutate(across(everything(), ~ list(c(., NA))), .keep = "unused") %>% unnest_wider(everything(), names_sep = ".") %>% select(sort(names(.))) %>% # 匹配带正负号的数字或纯数字 mutate(v1.1 = str_extract(v1, "[+-]?\\d+") %>% as.integer()) # 查看结果 df_complex2
提取所有数字并拼接
如果需要提取字符串中的全部数字(比如"(5+6)I think"里的5和6),可以用str_extract_all实现:
df_complex2 <- df_complex2 %>% mutate(v1.1_all = str_extract_all(v1, "[+-]?\\d+") %>% lapply(as.integer) %>% sapply(paste, collapse = ","))
执行后v1.1_all列会得到"5,6"、"-123"、"+45"这类拼接结果。
简化复制列的替代方案
你原有用cbind手动复制列的逻辑,可替换为across+unnest_wider的组合,代码更简洁且不易出错。
内容的提问来源于stack exchange,提问作者Miguel Von Fedak
相关产品推荐
相关产品推荐

