R语言正则提取数字字母序列并统计对应数值总和
解决方法
1. 正确拆分字符串
你原有的正则模式无法逐个提取每个数字+w/p单元,因为([0-9]+w)*([0-9]+p)*会匹配整个字符串的组合,而非单个单元。改用匹配单个单元的正则"\\d+[wp]",结合stringr包的str_extract_all函数就能得到预期的拆分结果:
library(stringr) s <- c("2w", "1p", "3w1p3w", "2p12w2p3w") split_list <- str_extract_all(s, "\\d+[wp]") split_list
输出结果:
[[1]] [1] "2w" [[2]] [1] "1p" [[3]] [1] "3w" "1p" "3w" [[4]] [1] "2p" "12w" "2p" "3w"
2. 统计w和p的数值总和
基于拆分后的结果,我们可以通过两种方式计算每个字符串中w、p对应的数值总和:
方法一:基础R实现
# 定义函数计算单个字符串的w、p总和 calc_sum <- function(x) { parts <- strsplit(x, "(?=[wp])", perl = TRUE)[[1]] w_sum <- sum(as.numeric(gsub("w", "", grep("w", parts, value = TRUE))), na.rm = TRUE) p_sum <- sum(as.numeric(gsub("p", "", grep("p", parts, value = TRUE))), na.rm = TRUE) return(c(w = w_sum, p = p_sum)) } # 应用到整个向量并转为数据框 sum_matrix <- t(sapply(s, calc_sum)) result_df <- data.frame(s = s, sum_matrix) result_df
方法二:tidyverse简洁实现
library(tidyverse) tibble(s = s) |> mutate(parts = str_extract_all(s, "\\d+[wp]")) |> unnest(parts) |> mutate( type = str_extract(parts, "[wp]"), value = as.numeric(str_extract(parts, "\\d+")) ) |> group_by(s) |> summarise( w = sum(value[type == "w"], na.rm = TRUE), p = sum(value[type == "p"], na.rm = TRUE) ) |> ungroup()
两种方法最终都会得到目标数据框:
s w p 1 2w 2 0 2 1p 0 1 3 3w1p3w 6 1 4 2p12w2p3w 15 4
关于gregexec的问题说明
你之前用gregexec得到的结果不符合预期,是因为你的正则模式用了*修饰捕获组,只会返回最后一个匹配的捕获组内容,而非所有单元。str_extract_all是专门提取所有匹配单个模式的工具,更适合这类场景。
内容的提问来源于stack exchange,提问作者tflutre
相关产品推荐
相关产品推荐

