如何将值从一个数据帧传输到另一个数据帧?

How to transfer values from one dataframe to another?

考虑以下代码生成以下数据帧

df1 <- data.frame("ID"=c("A", "A", "A", "A", "A", "B", "B", 'B', "B", "B"), 
 "X_A"=c(1,2,3,4,5,NA, NA, 8, 9,10), "X_B"=c(1,2,3,4,5,NA,NA, 8,9,10)
  ,"Y_A"=c(1,2,NA,NA, 10, 8,9,10,NA,NA), "Y_B"=c(1,2,NA, NA, 10,8, 
   9, 10, NA, NA))

它产生以下数据帧

     ID X_A X_B Y_A Y_B
 1   A   1   1   1   1
 2   A   2   2   2   2
 3   A   3   3  NA  NA
 4   A   4   4  NA  NA
 5   A   5   5  NA  NA
 6   B  NA  NA   8   8
 7   B  NA  NA   9   9
 8   B   8   8  10  10
 9   B   9   9  NA  NA
 10  B  10  10  NA  NA

我希望将数据从此数据帧传输到 df2

   ID X_A Y_A
1   A   1   1
2   A   2   2
3   A   3   3
4   A   4   4
5   A   5   5
6   A   6   6
7   A   7   7
8   A   8   8
9   A   9   9
10  A  10  10
11  B   1   1
12  B   2   2
13  B   3   3
14  B   4   4
15  B   5   5
16  B   6   6
17  B   7   7
18  B   8   8
19  B   9   9
20  B  10  10

结束数据框应该是这样的

    ID X_A Y_A X_B Y_B
 1   A   1   1   1   1
 2   A   2   2   2   2
 3   A   3   3   3  NA
 4   A   4   4   4  NA
 5   A   5   5   5  NA
 6   A   6   6  NA  NA
 7   A   7   7  NA  NA
 8   A   8   8  NA  NA
 9   A   9   9  NA  NA
 10  A  10  10  NA  NA
 11  B   1   1  NA  NA
 12  B   2   2  NA  NA
 13  B   3   3  NA  NA
 14  B   4   4  NA  NA
 15  B   5   5  NA  NA
 16  B   6   6  NA  NA
 17  B   7   7  NA  NA
 18  B   8   8   8   8
 19  B   9   9   9   9
 20  B  10  10  10  10

最终的输出就像一个vlookup的结果,其中df1和df2的ID和X_A、ID和Y_A列匹配,所以[=32=的对应值]和Y_B填入df2。如果没有匹配,结果应该是 NA。我试过下面的代码

merge(df1, df2). 

但这会减慢我的系统。我也试过

library(dplyr)
df2 %>% right_join(df1, by=c(ID, x_A, y_A). 

这会导致所有行都出现。能否在 R 中管理预期的输出。请求帮助

你的意思是,加入一次ID和X_A得到X_B,然后加入ID和Y_A得到Y_B?请注意,第 10 行不同:

df2 %>% 
  left_join(select(df1, ID, X_A, X_B),
            by = c("ID", "X_A")) %>%
  left_join(select(df1, ID, Y_A, Y_B),
            by = c("ID", "Y_A"))

# ID X_A Y_A X_B Y_B
# 1   A   1   1   1   1
# 2   A   2   2   2   2
# 3   A   3   3   3  NA
# 4   A   4   4   4  NA
# 5   A   5   5   5  NA
# 6   A   6   6  NA  NA
# 7   A   7   7  NA  NA
# 8   A   8   8  NA  NA
# 9   A   9   9  NA  NA
# 10  A  10  10  NA  10
# 11  B   1   1  NA  NA
# 12  B   2   2  NA  NA
# 13  B   3   3  NA  NA
# 14  B   4   4  NA  NA
# 15  B   5   5  NA  NA
# 16  B   6   6  NA  NA
# 17  B   7   7  NA  NA
# 18  B   8   8   8   8
# 19  B   9   9   9   9
# 20  B  10  10  10  10

基数 R:

want <- merge(df2, subset(df1, select = c(ID, X_A, X_B)), by = c("ID", "X_A"), all.x = TRUE)
(want <- merge(want, subset(df1, select = c(ID, Y_A, Y_B)), by = c("ID", "Y_A"), all.x = TRUE))