R 精确匹配某些列,某些列部分匹配内部连接
我有两个来自不同来源的数据框,它们指向同一个人,但由于自报数据的错误,日期可能会稍微偏离 示例数据:R 精确匹配某些列,某些列部分匹配内部连接,r,fuzzyjoin,R,Fuzzyjoin,我有两个来自不同来源的数据框,它们指向同一个人,但由于自报数据的错误,日期可能会稍微偏离 示例数据: df1 <- data.frame(name= c("Ann", "Betsy", "Charlie", "Dave"), dob= c(as.Date("2000-01-01", "%Y-%m-%d"), as.Date("
df1 <- data.frame(name= c("Ann", "Betsy", "Charlie", "Dave"),
dob= c(as.Date("2000-01-01", "%Y-%m-%d"), as.Date("2001-01-01", "%Y-%m-%d"),
as.Date("2002-01-01", "%Y-%m-%d"), as.Date("2003-01-01", "%Y-%m-%d")),
stringsAsFactors=FALSE)
df2 <- data.frame(name= c("Ann", "Charlie", "Elmer", "Fred"),
dob= c(as.Date("2000-01-11", "%Y-%m-%d"), as.Date("2004-01-01", "%Y-%m-%d"),
as.Date("2001-01-01", "%Y-%m-%d"), as.Date("2006-01-01", "%Y-%m-%d")),
stringsAsFactors=FALSE)
但也要在30天内以出生日期(dob)为准,fuzzyjoin软件包如下:
library(fuzzyjoin)
difference_inner_join(df1, df2, by=c("dob"), max_dist = 30)
name.x dob.x name.y dob.y
Ann 2000-01-01 Ann 2000-01-11
Betsy 2001-01-01 Elmer 2001-01-01
但是将这两个条件结合起来,这样只有Ann会被返回您可以这样做:
difference_inner_join(df1, df2, by=c("dob"), max_dist = 30) %>%
filter(name.x == name.y)
name.x dob.x name.y dob.y
1 Ann 2000-01-01 Ann 2000-01-11
仅依靠dplyr和base R。 我很少需要模糊连接<代码>内部连接和随后的
过滤器
通常就足够了
inner_join(df1, df2, by = c("name")) %>%
filter(abs(difftime(dob.x,dob.y, units = "days"))<30)
完美的我早些时候用循环实现了这一点,在实际数据上花费了>5分钟,行数>100000。您的解决方案在中有效我希望找到一个函数调用,将其全部放入
fuzzy\u-inner\u-join
smatch\u-fun=list(…)
,但它似乎需要=
,=
,我认为您的解决方案比将其全部放入inner\u-join函数更具可读性
inner_join(df1, df2, by = c("name")) %>%
filter(abs(difftime(dob.x,dob.y, units = "days"))<30)
name dob.x dob.y
1 Ann 2000-01-01 2000-01-11