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

Stata提取括号外数字并生成合并列表的技术问询

解决方案(R语言)

针对你的需求,我们可以用stringr包(属于tidyverse生态)配合正则表达式实现,步骤清晰高效:

1. 构造示例数据

先模拟你提到的数据框:

library(tidyverse)

df <- tibble(
  target_col = c("28316496(15)|28943784(8)|28579919(7)", "29343898(1)")
)

2. 提取每行的括号外数字(生成列表)

使用str_extract_all配合正向预查正则表达式\\d+(?=\\(),精准匹配括号前的数字:

# 新增列表列,存储每行提取出的数字
df <- df %>%
  mutate(num_list = str_extract_all(target_col, "\\d+(?=\\())")

此时num_list列的内容为:

  • 第一行:["28316496", "28943784", "28579919"]
  • 第二行:["29343898"]

3. 合并所有数字为分号分隔的字符串

将所有行的数字展开后合并:

final_result <- df %>%
  unnest_longer(num_list) %>%  # 展开列表列
  pull(num_list) %>%           # 提取数字向量
  str_collapse(";")            # 用分号合并

运行后final_result的结果就是你需要的:
"28316496;28943784;28579919;29343898"

备选:Base R实现(无需tidyverse)

如果不想加载tidyverse,用基础R也能完成:

df <- data.frame(
  target_col = c("28316496(15)|28943784(8)|28579919(7)", "29343898(1)"),
  stringsAsFactors = FALSE
)

# 提取所有数字
all_nums <- unlist(lapply(df$target_col, function(x) stringr::str_extract_all(x, "\\d+(?=\\())[[1]]"))
final_result <- paste(all_nums, collapse = ";")

正则表达式说明

\\d+(?=\\()的含义:

  • \\d+:匹配1个或多个数字
  • (?=\\():正向预查,确保匹配的数字后面紧跟左括号(,这样就只会提取括号外的目标数字,不会误匹配括号内的数字。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:51:03