因此,我有两个大小不等的列表,都包含名称。 第一个列表的元素是唯一的,纯净的名称,第二个列表的元素是重复的名称,后跟我不关心的字母数字书面信息。 我对R很陌生,所以请原谅我可能效率低下的工作方式。
这就是我所拥有的,
namesfun<-(sapply(Cnamesvec, function (x)(starts_with(x,sapply(MXnamesvec, function (y)y),ignore.case = T))))
Cnamesvec是第一个干净的较小列表,而MXnamesvec是后者。
这对我想做的事情来说效果很好,因为它为我提供了混合名称在列表中的纯净名称的位置,并且我可以根据我的输出重新排序和扩展纯净名称的列函数,然后将其绑定到我的数据框中。
但是我有一个小问题,我真的不知道该如何解决。 如果在我的干净名字列表中,我有“ Mario Garcia”,而在其他列表中,我有“ Mario Garcia Leader for 1 / 2f,最后完成...”,“ Mario Garcia”和“ Mario Garcia Jr”,那么这三个人都会比赛。我显然不希望“ Mario Garcia Jr”匹配。 但是,如果“ Mario Garcia”和“ Mario Garcia Jr”是两个不同的名称,则它们都将出现在纯名称列表中。 任何想法将不胜感激:)
我的清单示例 Cnamesvec:
(1)马里奥·加西亚(Mario Garcia)
(2)小马里奥·加西亚
(3)Huachipato
(4)丹尼尔·德罗西
MXnamesvec:
(1)丹尼尔·德·罗西(Daniel De Rossi)起跑不错,被甩在了第三位。
(2)马里奥·加西亚(Mario Garcia)被留在了化妆台上
(3)马里奥·加西亚(Mario Garcia Jr)落后第一,排名第一
(4)Huachipato快跑,一路领先
答案 0 :(得分:0)
我们可以按相反的顺序排列Cnamesvec
,以使"Mario Garcia Jr"
出现在"Mario Garcia"
之前,然后在使用MXnamesvec
的索引时将其删除:
Cnamesvec <- c(
"Mario Garcia",
"Mario Garcia Jr",
"Huachipato",
"Daniel De Rossi"
)
MXnamesvec <- c(
"Daniel De Rossi Started well, left behind,finished 3rd",
"Mario Garcia Was left in the draw stand",
"Mario Garcia Jr Started behind, finished 1st",
"Huachipato fast race,led all the way"
)
ind <- seq_along(MXnamesvec)
namesfun <- list()
for (clean_name in sort(Cnamesvec, decreasing = TRUE)) {
x <- tidyselect::starts_with(clean_name, vars = setNames(nm = MXnamesvec), ignore.case = TRUE)
y <- intersect(ind, x)
namesfun[[clean_name]] <- setNames(y, MXnamesvec[y])
ind <- setdiff(ind, x)
}
namesfun <- namesfun[Cnamesvec]
namesfun
# $`Mario Garcia`
# Mario Garcia Was left in the draw stand
# 2
#
# $`Mario Garcia Jr`
# Mario Garcia Jr Started behind, finished 1st
# 3
#
# $Huachipato
# Huachipato fast race,led all the way
# 4
#
# $`Daniel De Rossi`
# Daniel De Rossi Started well, left behind,finished 3rd
# 1