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

标签 r merge dplyr lookup

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

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列进行匹配,从而将X_B和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))

关于r - 如何将值从一个数据帧传输到另一个数据帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54805273/

相关文章:

r - 使用 Caret 包中的朴素贝叶斯分类器时的警告

SVN 将一个 Repo 的分支合并到另一个 Repo 的主干中

php - 合并两个数组的行(将一个数组中的行数据附加到另一个数组中的行)

行绑定(bind)嵌套列表中存在的所有 tibbles

r - 从字符和数字的数据框中子集字符列

r - “split”不是从 'namespace:data.table' 导出的对象

ruby - 在散列单行中加入公共(public)键

r - 在r中执行行和列之间的查找函数

r - 如何在数据帧的特定索引中插入行,其中仅在 R pipe dplyr 中包含上面几行的总和

r - 如何在 Rmarkdown 演示文稿(滑动)中回显代码之前显示 block 输出?