我有两个来自不同来源的数据框,它们引用的是同一个人,但是由于自报告数据存在错误,因此日期可能会略有缩短。
示例数据:
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)
我想用dplyr匹配确切的名称,例如:
library(dplyr)
inner_join(df1, df2, by = c("name"))
name dob.x dob.y
Ann 2000-01-01 2000-01-11
Charlie 2002-01-01 2004-01-01
,也可以使用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
答案 0 :(得分:0)
好吧,你可以这样做:
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
答案 1 :(得分:0)
仅依赖dplyr和基数R。
我很少需要模糊联接。 inner_join
和随后的filter
通常就足够了
inner_join(df1, df2, by = c("name")) %>%
filter(abs(difftime(dob.x,dob.y, "days"))<30)
结果
name dob.x dob.y
1 Ann 2000-01-01 2000-01-11