R语言中正确统计特定分隔符的元素数(排除括号内内容)
问题:统计西班牙语分隔元素总数(忽略括号内分隔符)
我有一个包含cartel列的R语言dataframe,该列存储多组西班牙语词汇。需要新增total列,统计每行中由逗号、表示“和”的“y”、表示“和/或”的“y/o”分隔的元素总数,但必须忽略括号内的分隔符。
示例数据集
bd_universal <- data.frame( cartel = c( "Cártel del Pacífico - Fracción Mayo Zambada, Cártel Jalisco", "Cártel Beltran Leyva, Cártel del Pacífico", "Cártel de Sinaloa y/o Pacífico", "Leyva y/o Grupo", "A, B, C y D", "Cártel del Pacífico - Fracción Los Menores, Cártel Jalisco Nueva Generación, Cártel de Arellano Félix", "A (B y C), D", "Leyva, Mayo y Junio Agosto", "R (T y P), S, H y/o L") )
预期结果
| cartel | total |
|---|---|
| Cártel del Pacífico - Fracción Mayo Zambada, Cártel Jalisco | 2 |
| Cártel Beltran Leyva, Cártel del Pacífico | 2 |
| Cártel de Sinaloa y/o Pacífico | 2 |
| Leyva y/o Grupo | 2 |
| A, B, C y D | 4 |
| Cártel del Pacífico - Fracción Los Menores, Cártel Jalisco Nueva Generación, Cártel de Arellano Félix | 3 |
| A (B y C), D | 2 |
| Leyva, Mayo y Junio Agosto | 3 |
| R (T y P), S, H y/o L | 4 |
我尝试的错误代码
bd_universal$total <- sapply(as.character(bd_universal$cartel), function(x) { x <- gsub("\\(.*?\\)", "", x) x <- gsub("y/o", ",y_o,", x) x <- gsub("-", " ", x) x <- gsub("(?<=\\w)\\s*y\\s*(?=\\w)", ",y", x, perl = TRUE) x <- gsub(",y_o,", "y/o", x) elementos <- unlist(strsplit(x, ",")) elementos <- trimws(elementos) elementos <- elementos[elementos != "Sin registro" & !is.na(elementos) & elementos != ""] elementos <- gsub("\\s*-\\s*", "", elementos) return(length(elementos)) })
正确实现方法
错误原因分析
原代码的问题在于:
- 处理
y/o时先替换再还原,逻辑混乱,导致y/o没有被正确转换成分隔符 - 对
y的替换只改成了,y,没有完全替换成分隔符,导致拆分后残留无效元素 - 括号处理后没有清理多余空格或符号,影响拆分结果
正确代码
library(stringr) bd_universal$total <- sapply(bd_universal$cartel, function(x) { # 1. 移除括号及内部所有内容,避免括号内的分隔符干扰统计 cleaned <- str_remove_all(x, "\\(.*?\\)") # 2. 将所有有效分隔符统一替换为逗号 # 先处理y/o,避免被后续y的替换误匹配 cleaned <- str_replace_all(cleaned, "\\s*y/o\\s*", ",") # 匹配作为"和"的单独y(前后为单词字符),替换为逗号 cleaned <- str_replace_all(cleaned, "(?<=\\w)\\s*y\\s*(?=\\w)", ",") # 3. 拆分并清理元素 elements <- str_split(cleaned, ",")[[1]] elements <- str_trim(elements) # 去除元素前后空格 elements <- elements[elements != ""] # 过滤空元素 # 返回有效元素数量 length(elements) }) # 查看最终结果 print(bd_universal)
代码说明
- 移除括号内容:用
str_remove_all直接删除所有括号及内部内容,确保括号内的y或逗号不会被统计 - 统一分隔符:
- 优先替换
y/o为逗号,避免后续处理y时误匹配y/o里的y - 用正向环视匹配单独的
y(前后是单词字符),确保只有作为“和”的y才会被当作分隔符
- 优先替换
- 拆分与清理:按逗号拆分后,去除元素前后空格并过滤空字符串,最后统计有效元素的数量
运行这段代码后,就能得到预期的total列结果。
内容的提问来源于stack exchange,提问作者mr.questions
相关产品推荐
相关产品推荐

