【发布时间】:2019-01-02 18:30:57
【问题描述】:
我有一个人名向量列表,其中每个向量只有名字和姓氏,我还有另一个向量列表,其中每个向量都有名字、中间名和姓氏。我需要匹配这两个列表以找到同时包含在两个列表中的人。因为名称不按顺序排列(有些向量将名字作为第一个值,而另一些向量将姓氏作为第一个值),我想通过在第二个列表中查找哪个向量来匹配这两个向量(全名) 包含第一个列表中向量的所有值(仅限名字和姓氏)。
到目前为止我做了什么:
#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"))
首先,我尝试创建一个函数来检查一个向量是否包含在另一个向量中(主要基于来自here 的代码)。
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
最后——尽管在一个问题中问得太多了——如果有人可以给我任何关于如何将 agrep() 用于模糊匹配以解决名称中的拼写错误的指示,那就太好了!如果没有,那也没关系,因为我想至少先找到匹配的部分。
【问题讨论】:
-
Wewe wajua 斯瓦希里语? Hayo majina nayajua。
-
@Onyambu Ndiyo, lakini najua Kidogo。 Wakati uliopita,niliishi 内罗毕。 Sasa nimesahau maneno mengi...
-
你说话流利..没关系..我确实回答了你的问题。只是我不明白你到底想匹配什么
-
如果您知道任何公司/组织有统计工作要做,例如数据分析、挖掘等,您可以给他们我的联系方式
-
@Onyambu 是的,确实如此。我将您的答案选为最有帮助的答案,因为我可以轻松修改它以使用 agrep 进行模糊匹配。