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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:58:36