【问题标题】:How to transfer values from one dataframe to another?如何将值从一个数据帧传输到另一个数据帧?
【发布时间】:2019-07-15 06:15:00
【问题描述】:

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

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 中管理预期的输出吗?请人帮忙

【问题讨论】:

    标签: r merge dplyr lookup


    【解决方案1】:

    你的意思是,在 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))
    

    【讨论】:

    • 它有效。是否可以使用 match ,它是相同的基本 R 函数。具有多列引用
    • 是的,几乎相同(代码 - 结果完全相同)。
    猜你喜欢
    • 2020-06-16
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 2021-10-10
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多