您可以先在 V1 (df1) = V1 (df2) 和 V2 (df1) = V2 (df2) 上合并,然后从 df1 中获取不满足这些条件的行。有了这些行,您现在可以再次与 V1 (df1) = V2 (df2) 和 V2 (df1) = V1 (df2) 合并,从而按照您所说的顺序模仿“OR”条件。
#Replicates of your dataframes
df1 <- data.frame(matrix(c(1, 200, 300,
2, 201, 301,
3, 202, 302), ncol=3, byrow = TRUE))
colnames(df1) <- c("iddf1", "V1", "V2")
df2 <- data.frame(matrix(c(1, 200, 300, "12-02-2018",
2, 301, 201, "25-05-2017",
3, 302, 202, "02-12-2016"), ncol=4, byrow = TRUE))
colnames(df2) <- c("iddf2", "V1", "V2", "week")
#Merge first on V1 (df1) = V2 (df2) and V2 (df1) = V2 (df2)
df.merged.1 <- merge(df1, df2, by = c("V1", "V2"), all.x = T)
#Extract the rows that did dot match
df1.unmet <- df.merged.1[is.na(df.merged.1$iddf2),c("iddf1", "V1", "V2")]
df.merged.1 <- df.merged.1[!is.na(df.merged.1$iddf2),]
#Merge then on V2 (df1) = V1 (df2) and V2 (df1) = V1 (df2)
df.merged.2 <- merge(df1.unmet, df2, by.x=c("V1", "V2"), by.y = c("V2", "V1"))
#rbind the two dataframes to get the final result
df.merged <- rbind(df.merged.1, df.merged.2)
df.merged
# V1 V2 iddf1 iddf2 week
#1 200 300 1 1 12-02-2018
#2 201 301 2 2 25-05-2017
#3 202 302 3 3 02-12-2016