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

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")
)

预期结果

carteltotal
Cártel del Pacífico - Fracción Mayo Zambada, Cártel Jalisco2
Cártel Beltran Leyva, Cártel del Pacífico2
Cártel de Sinaloa y/o Pacífico2
Leyva y/o Grupo2
A, B, C y D4
Cártel del Pacífico - Fracción Los Menores, Cártel Jalisco Nueva Generación, Cártel de Arellano Félix3
A (B y C), D2
Leyva, Mayo y Junio Agosto3
R (T y P), S, H y/o L4

我尝试的错误代码

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))
})

正确实现方法

错误原因分析

原代码的问题在于:

  1. 处理y/o时先替换再还原,逻辑混乱,导致y/o没有被正确转换成分隔符
  2. 对y的替换只改成了,y,没有完全替换成分隔符,导致拆分后残留无效元素
  3. 括号处理后没有清理多余空格或符号,影响拆分结果

正确代码

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)

代码说明

  1. 移除括号内容:用str_remove_all直接删除所有括号及内部内容,确保括号内的y或逗号不会被统计
  2. 统一分隔符:
    • 优先替换y/o为逗号,避免后续处理y时误匹配y/o里的y
    • 用正向环视匹配单独的y(前后是单词字符),确保只有作为“和”的y才会被当作分隔符
  3. 拆分与清理:按逗号拆分后,去除元素前后空格并过滤空字符串,最后统计有效元素的数量

运行这段代码后,就能得到预期的total列结果。

内容的提问来源于stack exchange,提问作者mr.questions

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:22:32