我有一个数据框,其中有一列包含多个西班牙语单词。我想要计算每行包含的元素总数。我有以下数据框作为示例:
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”在英语中表示“and/or”)。我想要创建一个名为“total”的新列,用于计算由这些因子分隔的元素数量,除非它们位于括号内。因此,生成的数据框将如下所示:
卡特尔 | 全部的 |
---|---|
Cártel del Pacífico - Fracción Mayo Zambada, Cártel Jalisco | 2 |
-------------------------------------------------- ---------------- | -------- |
卡特尔·贝尔特兰·莱瓦 (Cártel Beltran Leyva)、卡特尔·德尔·太平洋 (Cártel del Pacífico) | 2 |
-------------------------------------------------- ---------------- | -------- |
锡那罗亚和太平洋卡特尔 | 2 |
-------------------------------------------------- ---------------- | -------- |
Leyva y/o Grupo | 2 |
-------------------------------------------------- ------------ | -------- |
A、B、C 和 D | 4 |
-------------------------------------------------- ---------------- | -------- |
Cártel del Pacífico - Fracción Los Menores, 卡特尔哈利斯科 | |
新世代,阿雷利亚诺菲利克斯卡特尔 | 3 |
-------------------------------------------------- ---------------- | -------- |
A (由 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。
有人知道如何解决这个问题吗?谢谢!
一种使用最少正则表达式的方法,首先删除括号
(...)
,依赖于括号始终是闭合的这一事实。然后给出strsplit
所有拆分参数。最后获取向量lengths
。输出
(...)
注意,如果一个向量中有多个,则替换sub(...
为gsub("\\([ [:alnum:]/]*\\)", "", cartel)
我会把这个问题分解成子问题。
以下是我的分步食谱:
结果
您可以使用
strplit
任何字符进行拆分,使用 perl 的负向前/向后正则表达式对括号取反,然后计算每个元素的长度:此正则表达式适用于您的示例。但是,如果您想对任何长度超过 1 个字符(例如
(ABC y DEF)
)的内容使用负向前瞻/后瞻,则需要对点添加限制.
,例如.{1, 15}
: