我有一个数据框,其中有一列包含多个西班牙语单词。我想要的是计算每行包含的元素总数。我有以下数据框作为示例:
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。
有人知道如何解决这个问题吗?谢谢!
我会把这个问题分解成子问题。
这是我的逐步食谱:
# 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