我目前正在做一个项目,并且遇到了一个问题.我试图匹配基于候选人姓名的两个数据帧。我已经成功地做到了这一点,但是除了max_dist为2的任何东西,我开始获得重复的条目。然而,如果在参加stringdist_join之前,我可以按种族(州和地区)“分组”这些候选人,那么很容易避免这种情况,因为在每一场比赛中只有少数几个候选人,几乎没有机会拥有两个名字相似的候选人。
目标是获得一个名为tmpJoin的表,其中我可以同时拥有candidateID和canVotes,以及名称、状态、区。
如有任何建议,将不胜感激!
下面是我的代码以及两个数据集的复制
state <- c('AL','AL','AL','AL','AL','NY','NY','NY','NY','NY')
district <-c('01','02','02','03','01','01','02','01','02','02')
FullName <-c('Sonny Callahan','Tom Bevill','Faye Baggiano','Thomas
Bevill','Don Sledge','William Turner', 'Bill Turner','Ed Smith','Tom
Bevill','Edward Smith')
canVotes <-c('234','589','9234','729','149','245','879','385','8712','7099')
yearHouseResult <- data.frame(state, district, FullName,canVotes)
state <- c('AL','AL','AL','AL','AL','NY','NY','NY','NY','NY')
district <-c('01','02','02','03','01','01','02','01','02','02')
FullName <-c('Sonny Callahan','Tom Beville','Faye Baggiano','Thom Bevill','Donald Sledge','Bill Turner', 'Bill Turner','Ed Smith','Tom Bevill','Ed Smith')
candidateID <- c('1','2','3','4','5','6','7','8','9','10')
congrCands <- data.frame(state, district, FullName, candidateID)
tmpJoin <- stringdist_join(congrCands, yearHouseResult,
by = "FullName",
max_dist=2,
method = "osa",
ignore_case = FALSE,
distance_col = "matchingDistance")发布于 2020-09-06 18:58:09
您可以使用fuzzy_inner_join测试这三个条件,也可以从fuzzyjoin包中测试。
首先,我不得不将这些因素转换成数字和字符,因为不同的因素级别会使函数混乱。
给fuzzy_join的一些信息。在参数中,match_fun是对这三个条件的描述,而在by中,则指定条件的列。
FullName
该表包含比您需要的更多的列。因此,您可以选择所需的列。我只是觉得这样控制比赛会更容易。
yearHouseResult <- data.frame(state, district, FullName,canVotes) %>%
mutate(state = as.character(state),
district = as.numeric(district),
FullName = as.character(FullName))
congrCands <- data.frame(state, district, FullName, candidateID) %>%
mutate(state = as.character(state),
district = as.numeric(district),
FullName = as.character(FullName))
t <- fuzzy_inner_join(congrCands, yearHouseResult,
match_fun = list(function(x,y) stringdist(x,y,
method="osa") < 4,
`==`,
function(x,y) str_detect(x,y)),
by = c( "FullName", "district", "state"))如果您将字符串的数量从4增加到5,您将正确地匹配Ed/Edward Smith,但不正确地匹配William/Bill Turner。所以你需要决定什么是更重要的,干净的匹配还是更多的匹配。
https://stackoverflow.com/questions/63766831
复制相似问题