正确计算逗号分隔字符串中的元素,以及 R 中的“and”和“and/or”,排除某些情况

问题描述 投票:0回答:1

我有一个数据框,其中有一列包含多个西班牙语单词。我想要的是计算每行包含的元素总数。我有以下数据框作为示例:

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

每行包含的值总数由三件事来区分:分隔最后一个单词的“y”(“y”在英语中是“and”)、“,”和“y/o” ”(“y/o”在英语中是“和/或”)。我想要的是创建一个名为“total”的新列,用于计算由这些事实分隔的元素数量,除非它们位于括号内。因此,生成的数据框将如下所示:

卡特尔 总计
Cártel del Pacífico - Fracción Mayo Zambada,Cártel Jalisco 2
------------------------------------------------- ---------------- --------
贝尔特兰·莱瓦卡特尔、太平洋卡特尔 2
------------------------------------------------- ---------------- --------
锡那罗亚和太平洋卡特尔 2
------------------------------------------------- ---------------- --------
Leyva y/o Grupo 2
------------------------------------------------- ------------- --------
A、B、C 和 D 4
------------------------------------------------- ---------------- --------
Cártel del Pacífico - Fracción Los Menores,Cártel Jalisco
新世代,阿雷利亚诺菲利克斯卡特尔 3
------------------------------------------------- ---------------- --------
A(B y C),D 2
------------------------------------------------- ---------------- --------
莱瓦、梅奥和朱尼奥·阿戈斯托 3
------------------------------------------------- ---------------- --------
R (T y/o 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))
})

使用此代码,“Cártel del Pacífico - Fracción Mayo Zambada, Cártel Jalisco”之类的值将计为 3,尽管根据我的查找,它们只有 2。

有人知道如何解决这个问题吗?谢谢!

r string dataframe counting
1个回答
0
投票

我会把这个问题分解成子问题。

这是我的逐步食谱:

  1. 忽略括号
  2. 将“y/o”转换为“y_o”以避免弄乱“/o”部分
  3. 将“y”视为另一个“逗号”
  4. 恢复步骤2
  5. 用逗号分隔
# your data
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")
)

# recipe
bd_universal$total <- sapply(as.character(bd_universal$cartel), function(x) {
  # step 1
  x <- gsub("\\(.*?\\)", "", x)

  # step 2
  x <- gsub("y/o", "_y_o_", x)

  # step 3
  x <- gsub("(?<=\\w)\\s+y\\s+(?=\\w)", ",", x, perl = TRUE)

  # step 4
  x <- gsub("_y_o_", "y/o", x)

  # step 5
  elementos <- trimws(unlist(strsplit(x, ",")))

  length(elementos[elementos != ""])
})

结果

> bd_universal$total 
[1] 2 2 1 1 4 3 2 3 3
© www.soinside.com 2019 - 2024. All rights reserved.