我目前正在研究一个项目,但遇到了问题...我正在尝试根据候选人的姓名匹配两个数据框。我设法做到了,但是在max_dist大于2的情况下,我开始得到重复的条目。但是,如果我可以在运行stringdist_join之前按种族(州和地区)将候选人“分组”,则很容易避免这些情况,因为每场比赛只有少数候选人,几乎没有机会让两个候选人具有相同的名字。
目标是获得一个名为tmpJoin的表,在其中我可以同时拥有候选人ID和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")
答案 0 :(得分:0)
您也可以使用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"))
如果将stringdist的数量从4增加到5,您将正确匹配Ed / Edward Smith,但不正确地匹配William / Bill Turner。因此,您需要确定最重要的是一个或多个完整匹配。