【发布时间】:2021-07-27 12:20:19
【问题描述】:
给定 2 个数据框:
df1
col1 col2 col3
43 21 "a"
32 31 "b"
NA 12 "c"
44 NA "d"
df2
cl4 cl5 cl6
43 1 "text"
12 0 "text2"
32 44 "text3"
如果c("col1", "col2") 中的列值与c("cl4", "cl5") 列中的值匹配,我如何将它们与left_join 合并?
附加信息:所有变量都可以有缺失值,但总是完成的 cl6 除外。
预期结果:
col1 col2 col3 cl4 cl5 cl6
43 21 "a" 43 1 "text"
32 31 "b" 32 44 "text3"
NA 12 "c" 12 0 "text2"
44 NA "d" 32 44 "text3"
我有一些有效的代码,但我认为如果有很多连接要做(在我的真实数据框中,我有 24 个连接要做......),我认为必须有更好的解决方案。 这是我的代码:
list_vars = c('cl4', "cl5", "cl6")
list_vars_rename = c("col4", "col5", "col6")
#MERGE 1
df1_merged <- left_join(df1, df2, by=c("col1" = "cl4"), na_matches = "never") #ignore NAs
df1_merged$cl4 <- df1_merged$col1 #because cl4 disappears during the join
df1_merged[is.na(df1_merged$cl6), "cl4"] <- NA #cl4 equals NA if no match = if cl6 NA
setnames(df1_merged, old = list_vars, new = list_vars_rename, skip_absent = T) #rename cols
#MERGE 2
df1_merged <- left_join(df1_merged, df2, by=c("col1" = "cl5"), na_matches = "never")
df1_merged <- as.data.frame(df1_merged) #because was a tibble
df1_merged$cl5 <- df1_merged$col1 #because cl4 disappears during the join
df1_merged[is.na(df1_merged$cl6), "cl5"] <- NA #cl5 equals NA if no match = if cl6 NA
for (i in seq_along(list_vars_rename)){
df1_merged[,list_vars_rename[i]] <- ifelse(is.na(df1_merged[,list_vars_rename[i]]), df1_merged[,list_vars[i]], df1_merged[,list_vars_rename[i]])
} #fill col4, col5 & col6 with the values of cl4, cl5 & cl6 we got in the join
df1_merged = df1_merged[, !(names(df1_merged) %in% list_vars)] #drop cl4 ,cl5 & cl6
#MERGE 3
df1_merged <- left_join(df1_merged, ventes, by=c("col2" = "cl4"), na_matches = "never")
df1_merged <- as.data.frame(df1_merged)
df1_merged$cl4 <- df1_merged$col2
df1_merged[is.na(df1_merged$cl6), "cl4"] <- NA
for (i in seq_along(list_vars_rename)){
df1_merged[,list_vars_rename[i]] <- ifelse(is.na(df1_merged[,list_vars_rename[i]]), df1_merged[,list_vars[i]], df1_merged[,list_vars_rename[i]])
}
df1_merged= df1_merged[, !(names(df1_merged) %in% list_vars)]
###etc. until the last merge.
【问题讨论】: