我有兩個表,我想使用多個列來連接,這使用dplyr連接函式是完全可行的。復雜性來自這樣一個事實,即我需要加入多個列,并且如果至少一個列連接成功,則連接應該成功。為了證明我的情況,這里有一個可重現的例子:
df1 <- data.frame(
A1 = c(1,2,3,4),
B1 = c(4,5,6,7),
C1 = c("a", "b", "c", "d")
)
df2 <- data.frame(
A2 = c(8,"",3,4),
B2 = c(9,5,"",7),
C2 = c("aa", "bb", "cc", "dd")
)
我想加入A 或 B 列df1,這意味著保留至少 df1$A = df2$A 或 df1$B = df2$B 的所有行(請注意我的真實資料集有 6 個我想使用的列加入)。簡化示例的最終結果應該是:df2
data.frame(
A1 = c(2,3,4),
A2 = c("",3,7),
B1 = c(5,6,7),
B2 = c(5,"", 7),
C1 = c("b", "c", "d"),
C2 = c("bb", "cc", "dd")
)
非常感謝您提供有關如何有效完成此操作的任何建議,或者如果無法快速完成,則也可以接受慢速解決方案
uj5u.com熱心網友回復:
不太確定如何使用 來執行此操作dplyr,但sqldf可以幫助您:
library(sqldf)
sqldf("SELECT *
FROM df1
JOIN df2
ON df1.A1 = df2.A2
OR df1.B1 = df2.B2")
您可以在此之后為更多列添加額外的 OR 陳述句。
uj5u.com熱心網友回復:
似乎通過一次呼叫dplyrjoin 函式是不可能的。
如果您想使用dplyr連接,這是我使用purrrmap 函式創建的一個 hacky 解決方法,為條件連接中的每個條件執行單獨的內部連接。然后將它們系結在一起并洗掉重復的行。通過附加到key1和key2向量,可以將其推廣到更多列。
注意:首先我們需要修改示例資料,使要連接的列具有相同的型別。dplyr如果您嘗試連接不兼容的列型別(在本例中為整數和字符),則會引發錯誤。
library(dplyr)
library(purrr)
df1 <- df1 %>%
mutate(A1 = as.character(A1), B1 = as.character(B1))
key1 <- c('A1', 'B1')
key2 <- c('A2', 'B2')
map2_dfr(key1, key2, ~ inner_join(df1, df2, by = setNames(.y, .x), keep = TRUE)) %>%
distinct()
結果:
A1 B1 C1 A2 B2 C2
1 3 6 c 3 cc
2 4 7 d 4 7 dd
3 2 5 b 5 bb
uj5u.com熱心網友回復:
一個簡單的方法可以是:
library(dplyr)
df1 <- df1 %>%
mutate(A1 = as.character(A1), B1 = as.character(B1))
df1 %>%
bind_cols(df2) %>%
filter(A1 == A2 | B1 == B2) %>%
relocate(sort(names(.)))
#> A1 A2 B1 B2 C1 C2
#> 1 2 5 5 b bb
#> 2 3 3 6 c cc
#> 3 4 4 7 7 d dd
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/454463.html
上一篇:如何連接在谷歌表中選擇的名稱?
