两个列表之间存在部分str_match,边界问题

时间:2018-07-20 09:44:28

标签: r

因此,我有两个大小不等的列表,都包含名称。 第一个列表的元素是唯一的,纯净的名称,第二个列表的元素是重复的名称,后跟我不关心的字母数字书面信息。 我对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快跑,一路领先

1 个答案:

答案 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