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

