使用 stringdist_join 对两个数据框进行分组
Grouping two data frames using stringdist_join
我目前正在做一个项目,遇到了一个问题...我正在尝试根据候选人的姓名匹配两个数据框。我已经设法做到了这一点,但是如果 max_dist 超过 2,我就会开始得到重复的条目。但是,如果我可以 'group' 在 运行 stringdist_join 之前按种族(州和地区)选出候选人,这些将很容易避免,因为每场比赛中只有少数候选人,机会很小有两个名字相似的候选人。
目标是获得一个名为 tmpJoin 的 table,我可以在其中获得 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")
您可以使用 fuzzy_inner_join
测试所有三个条件,同样来自 fuzzyjoin
包。
首先我不得不将因子更改为数字和字符,因为不同的因子水平会干扰函数。
一些信息给fuzzy_join
。在参数 match_fun
中是对三个条件的描述,在 by
中指定了条件的列。
- stringdist < 4 对于
FullName
- 分区必须相等
- state 必须相等(district 是一个数字,state 是一个字符,因此需要两个不同的函数来比较这些列)
table 包含的列比您需要的多。因此,您可能 select 需要的列。我只是觉得这样控制比赛会更容易。
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。所以你需要决定是干净的比赛还是更多的比赛更重要。
我目前正在做一个项目,遇到了一个问题...我正在尝试根据候选人的姓名匹配两个数据框。我已经设法做到了这一点,但是如果 max_dist 超过 2,我就会开始得到重复的条目。但是,如果我可以 'group' 在 运行 stringdist_join 之前按种族(州和地区)选出候选人,这些将很容易避免,因为每场比赛中只有少数候选人,机会很小有两个名字相似的候选人。
目标是获得一个名为 tmpJoin 的 table,我可以在其中获得 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")
您可以使用 fuzzy_inner_join
测试所有三个条件,同样来自 fuzzyjoin
包。
首先我不得不将因子更改为数字和字符,因为不同的因子水平会干扰函数。
一些信息给fuzzy_join
。在参数 match_fun
中是对三个条件的描述,在 by
中指定了条件的列。
- stringdist < 4 对于
FullName
- 分区必须相等
- state 必须相等(district 是一个数字,state 是一个字符,因此需要两个不同的函数来比较这些列)
table 包含的列比您需要的多。因此,您可能 select 需要的列。我只是觉得这样控制比赛会更容易。
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。所以你需要决定是干净的比赛还是更多的比赛更重要。