当前位置: 首页 > 知识库问答 >
问题:

查看列表中的哪个向量包含在另一个列表的向量中(查找人名匹配)

丌官嘉勋
2023-03-14

我有一个人名向量列表,每个向量只有名字和姓氏,我有另一个向量列表,每个向量有名字的第一个,中间的,姓氏。我需要匹配这两个列表,以找到包含在这两个列表中的人。因为名称不是按顺序排列的(有些向量以名字作为第一个值,而有些向量以姓氏作为第一个值),所以我想通过查找第二个列表中的哪个向量(全名)包含第一个列表中某个向量的所有值(只有名字和姓氏)来匹配这两个向量。

到目前为止我所做的:

#reproducible example
first_last_names_list <- list(c("boy", "boy"),
                       c("bob", "orengo"),
                       c("kalonzo", "musyoka"),
                       c("anami", "lisamula"))

full_names_list <- list(c("boy", "juma", "boy"), 
                        c("stephen", "kalonzo", "musyoka"),
                        c("james", "bob", "orengo"),
                        c("lisamula", "silverse", "anami"))

首先,我尝试创建一个函数来检查一个向量是否包含在另一个向量中(主要基于这里的代码)。

my_contain <- function(values,x){
    tx <- table(x)
    tv <- table(values)
    z <- tv[names(tx)] - tx
    if(all(z >= 0 & !is.na(z))){
       paste(x, collapse = " ")
       }
    }

#value would be the longer vector (from full_name_list) 
#and x would be the shorter vector(from first_last_name_list)

然后,我试图将这个函数放入sapply()中,这样我就可以处理列表了,这就是我陷入困境的地方。我可以让它看看一个向量是否包含在一个向量列表中,但我不知道如何检查一个列表中的所有向量,看看它是否包含在第二个列表中的任何一个向量中。

#testing with the first vector from first_last_names_list. 
#Need to make it run through all the vectors from first_last_names_list.

sapply(1:length(full_names_list),
   function(i) any(my_contain(full_names_list[[i]], 
                              first_last_names_list[[1]]) == 
                              paste(first_last_names_list[[1]], collapse = " ")))

#[1]  TRUE FALSE FALSE FALSE

最后--尽管在一个问题中可能问得太多了--如果有人能给我一些关于如何结合grep()进行模糊匹配以解释名字中的错别字的建议,那就太好了!如果不是,那也没关系,因为我想要得到至少匹配部分的权利首先。

共有1个答案

翁烨霖
2023-03-14

由于您正在处理列表,最好将它们折叠为向量,以便于处理正则表达式。但你只需按升序排列。在这种情况下,您可以很容易地匹配它们:

lst=sapply(first_last_names_list,function(x)paste0(sort(x),collapse=" "))
 lst1=gsub("\\s|$",".*",lst)
 lst2=sapply(full_names_list,function(x)paste(sort(x),collapse=" "))
 (lst3 = Vectorize(grep)(lst1,list(lst2),value=T,ignore.case=T))
               boy.*boy.*             bob.*orengo.*        kalonzo.*musyoka.*         anami.*lisamula.* 
           "boy boy juma"        "bob james orengo" "kalonzo musyoka stephen" "anami lisamula silverse" 

现在,如果要链接first_name_last_name_listfull_name_list,那么:

setNames(full_names_list[ match(lst3,lst2)],sapply(first_last_names_list[grep(paste0(names(lst3),collapse = "|"),lst1)],paste,collapse=" "))
$`boy boy`
[1] "boy"  "juma" "boy" 

$`bob orengo`
[1] "james"  "bob"    "orengo"

$`kalonzo musyoka`
[1] "stephen" "kalonzo" "musyoka"

$`anami lisamula`
[1] "lisamula" "silverse" "anami"   

其中名称来自first_last_list,元素来自full_name_list。如果你能处理字符向量而不是列表,那就太好了:

 类似资料:
  • 问题内容: 我有一个产品ID列表,我想找出哪些订单包含所有这些产品。订单表的结构如下: 显然,我可以使用PHP中的一些循环来做到这一点,但是我想知道是否有一种优雅的方法可以完全在mysql中完成。我理想的幻想查询将是这样的: 有希望还是我应该去阅读托尔金?:)另外,出于好奇,如果不能在mysql中使用,是否还有其他具有此功能的数据库? 问题答案: 你很亲密 关于关系代数中的“出于好奇”问题,这可以

  • 问题内容: 我有两个列表,一个包含 相册,文件对的 列表,另一个仅包含有关一张照片的信息- 相册 (位置0)和 文件 (位置1) 如何查看 照片 列表是否在 照片 列表中?就像字符串一样。 相册 , 文件的 位置无关紧要,因为不会有任何 文件 等于 相册 。 问题答案: 同样喜欢字符串。不仅如此,也是 如此 。也适用于列表中的列表: 对列表的成员资格测试仅迭代列表,并对每个元素使用相等性测试以查看

  • 问题内容: 我有两个带有不同对象的列表。 我想检查list2中的元素是否存在于list2中,基于特定的属性(Object1和Object2具有(以及其他),一个共有属性(类型为Long),名为attributeSame)。 现在,我这样做是这样的: 但是我认为有一种更好,更快的方法可以做到这一点:)有人可以提出吗? 谢谢! 问题答案: 如果只需要测试基本相等性,则可以使用基本JDK来完成,而无需在

  • 我有两个不同对象的列表。 我想根据特定的属性(Object1和Object2有一个共同的属性(类型为Long),名为AttributeName),检查list2中是否存在list1中的元素。 现在,我是这样做的: 但我认为有更好更快的方法可以做到这一点:)有人能提出吗? 谢谢

  • 问题内容: 如果我有这个: 然后在a中找到b: 有没有办法对列表做类似的事情?像这样: False的结果是可以理解的-因为它正确地寻找了一个元素’de’,而不是(我恰好想要它做的)’d’之后是’e’ 这是可行的,我知道: 我可以处理数据以获得所需的内容-但是有没有一种简短的Pythonic方式可以做到这一点? 需要说明的是:我需要在此处保留顺序(b = [‘e’,’d’],应返回False)。 如

  • 我需要比较两个列表,以便创建在一个列表中找到的特定元素的新列表,而不是在另一个列表中。例如: 我想在列表_1中循环,并将列表_2中未在列表_1中找到的所有元素附加到主列表。 结果应该是: 用python怎么做?