首页 > 解决方案 > 两个列表之间的部分 str_match,边界问题

问题描述

所以我有两个大小不等的列表,都包含名称。第一个列表的元素是唯一的、干净的名称,第二个列表的元素是重复的名称,后面是我不关心的字母数字书面信息。我对 R 很陌生,所以请原谅我可能效率低下的做事方式。

所以这就是我所拥有的,

namesfun<-(sapply(Cnamesvec, function (x)(starts_with(x,sapply(MXnamesvec, function (y)y),ignore.case = T))))

Cnamesvec 是第一个、干净、较小的列表,而 MXnamesvec 是后者。

这对于我想要做的事情很好,因为它给了我在列表中的干净名称与混合名称的位置,我可以根据我的函数的输出重新排序和扩展干净名称的列,然后cbind 它在我的数据框上。

但是我有一个小问题,我真的不知道如何解决。如果在我的干净名字列表中我有“Mario Garcia”,而在另一个列表中我有“Mario Garcia Leader for 1/2f,finished last...”,“Mario Garcia”和“Mario Garcia Jr”,他们三个都会匹配。我显然不希望“Mario Garcia Jr”匹配。但如果“Mario Garcia”和“Mario Garcia Jr”是两个不同的名字,那么它们都会在干净的名字列表中。任何想法将不胜感激:)

我的列表 Cnamesvec 示例:

(1) 马里奥·加西亚

(2) 小马里奥·加西亚

(3) 华池派

(4) 丹尼尔·德罗西

MXnamesvec:

(1) Daniel De Rossi 开局不错,落后,排名第三

(2) 马里奥·加西亚被留在抽签台上

(3) Mario Garcia Jr 起步落后,排名第一

(4)花旗帕快跑,一路领先

标签: r

解决方案


我们可以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 

推荐阅读