簡體   English   中英

是否有 R 函數根據兩列分別匹配同一列來合並兩個數據框?

[英]Is there an R function to merge two data frames based on two columns separately matching to the same column?

我想分別基於兩列之一( "VALA""VALB" )填充兩個值( "VAL" "VALB" )。

# Data 
DF1 <- data.frame("colA" = rep(c("A","B"), 6),
                  "colB" = rep(c("C","D","E"), 4))

DF2 <- data.frame("colC" = c("A","B","C","D","E"),
                  "VAL" = 1:5)

# three join calls     
tmp1 <- left_join(DF1, DF2, by=c("colA"="colC"))
names(tmp1)[3] <-  "VALA"

tmp2 <- left_join(DF1, DF2, by=c("colB"="colC"))
names(tmp2)[3] <-  "VALB"

left_join(tmp1, tmp2, by=c("colA", "colB"))

#    colA colB VALA VALB
# 1     A    C    1    3
# 2     A    C    1    3
# 3     B    D    2    4
# 4     B    D    2    4
# 5     A    E    1    5
# 6     A    E    1    5
# 7     B    C    2    3
# 8     B    C    2    3
# 9     A    D    1    4
# 10    A    D    1    4
# 11    B    E    2    5
# 12    B    E    2    5
# 13    A    C    1    3
# 14    A    C    1    3
# 15    B    D    2    4
# 16    B    D    2    4
# 17    A    E    1    5
# 18    A    E    1    5
# 19    B    C    2    3
# 20    B    C    2    3
# 21    A    D    1    4
# 22    A    D    1    4
# 23    B    E    2    5
# 24    B    E    2    5

為什么最后一個操作給出 24 行作為輸出而不是預期的 12 行?

有沒有可能以最優雅的方式(而不是 3 個連接操作)實現相同的預期?

您可以使用match來查找相應的值並cbind resluting 列。

cbind(DF1, VALA=DF2$VAL[match(DF1$colA, DF2$colC)],
  VALB=DF2$VAL[match(DF1$colB, DF2$colC)])
   colA colB VALA VALB
#1     A    C    1    3
#2     B    D    2    4
#3     A    E    1    5
#4     B    C    2    3
#5     A    D    1    4
#6     B    E    2    5
#7     A    C    1    3
#8     B    D    2    4
#9     A    E    1    5
#10    B    C    2    3
#11    A    D    1    4
#12    B    E    2    5

或使用名稱:

x <- setNames(DF2$VAL, DF2$colC)
cbind(DF1, VALA=x[DF1$colA], VALB=x[DF1$colB])

並且如果許多列在lapply內使用match

cbind(DF1, setNames(lapply(DF1, function(x) DF2$VAL[match(x, DF2$colC)]),
 sub("col", "VAL", names(DF1))))
#   colA colB VALA VALB
#1     A    C    1    3
#2     B    D    2    4
#3     A    E    1    5
#4     B    C    2    3
#5     A    D    1    4
#6     B    E    2    5
#7     A    C    1    3
#8     B    D    2    4
#9     A    E    1    5
#10    B    C    2    3
#11    A    D    1    4
#12    B    E    2    5

嘗試使用%>%一個接一個地組合left_join並定義其后綴。

DF1 <- DF1 %>%
  left_join(DF2, c("colA" = "colC")) %>%
  left_join(DF2, c("colB" = "colC"), 
            suffix = c ("A", "B"))

> DF1
   colA colB VALA VALB
1     A    C    1    3
2     B    D    2    4
3     A    E    1    5
4     B    C    2    3
5     A    D    1    4
6     B    E    2    5
7     A    C    1    3
8     B    D    2    4
9     A    E    1    5
10    B    C    2    3
11    A    D    1    4
12    B    E    2    5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM