完全匹配某些列,部分匹配 inner_join
Match some columns exactly, and some partially with inner_join
我有两个来自不同来源的数据框,它们指的是同一个人,但由于自我报告数据的错误,日期可能略有偏差。
示例数据:
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
你可以这样做:
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
然后 filter
通常就足够了
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
我有两个来自不同来源的数据框,它们指的是同一个人,但由于自我报告数据的错误,日期可能略有偏差。
示例数据:
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
你可以这样做:
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
然后 filter
通常就足够了
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