【问题标题】:how to join two dataframes by updating value contains duplicate for matched ids in r如何通过更新值来连接两个数据帧包含 r 中匹配 id 的重复项
【发布时间】:2020-12-05 19:06:54
【问题描述】:

我有数据集dm,它包含 1000 行和 15 列,看起来像:

dm <- "ID  NAME    col1    col2    col3    col4    col5
123  a1      M       20      2.0    56      3   
234  b1      M       25      2.2    54      3   
345  c1      F       23      2.3    52      2   
456  d1      M       24      2.5    50      2   
567  e1      F       26      2.6    48      2   
678  f1      F       28      2.8    46      1   
789  h1      M       29      2.9    44      1   
900  k1      M       27      3.1    42      0   
123  a1      M       27      3.2    40      0   
234  b1      M       27      3.4    38     -1   
345  c1      F       25      3.5    36     -1"
dm <- read.table(text = dm, header = TRUE)

我的其他数据框 df2 包含 2000 行 5 列看起来像

df2 <- "ID  NAME        col1   col2 col3
123   a1           0    1   2
234   b1           1    0   1
345   c1           2    2   0
456   d1           0    1   1"
df2 <- read.table(text = df2, header = TRUE)

当我使用dplyrright_joindf3 &lt;- right_join(df2,dm,c("ID","NAME"))

它是正确的,但出了问题的是结果输出显示如下

ID  NAME    col1    col2    col3    col4    col5     col10  col12   col13   …
123   a1    M        20      2.0    56        3        0       1    2   
234   b1    M        25      2.2    54        3        1       0    1   
345   c1    F        23      2.3    52        2        2       2    0   
456   d1    M        24      2.5    50        2        0       1    1   
123   a1    M        20      2.0    56        3        NA      NA   NA  
234   b1    M        25      2.2    54        3        NA      NA   NA  
345   c1    F        23      2.3    52        2        NA      NA   NA  
456   d1    M        24      2.5    50        2        NA      NA   NA  

预期结果:

    ID   NAME  col1     col2    col3    col4    col5     col10  col12   col13   …
    123   a1    M        20      2.0    56        3        0       1    2   
    234   b1    M        25      2.2    54        3        1       0    1   
    345   c1    F        23      2.3    52        2        2       2    0   
    456   d1    M        24      2.5    50        2        0       1    1   
    123   a1    M        20      2.0    56        3        0       1    2   
    234   b1    M        25      2.2    54        3        1       0    1   
    345   c1    F        23      2.3    52        2        2       2    0
    456   d1    M        24      2.5    50        2        0       1    1   

【问题讨论】:

  • 这很奇怪。那肯定看起来它正在以相反的顺序使用数据集。尝试先列出 dm 进行左连接。
  • 你可以试试df3 &lt;- merge(dm,df2,by.x = c('ID','NAME'),by.y = c('ID','NAME'),all.x = T)

标签: r dplyr merge left-join


【解决方案1】:

在执行变异连接时,x 的行和列的顺序尽可能保留,组取自x。在您的代码中,x = df2 应该是 y =

使用x = df1y = df2 重新排序数据帧会产生:

数据:

library(dplyr)

df1 <- "ID  NAME    col1    col2    col3    col4    col5
123  a1      M       20      2.0    56      3   
234  b1      M       25      2.2    54      3   
345  c1      F       23      2.3    52      2   
456  d1      M       24      2.5    50      2   
567  e1      F       26      2.6    48      2   
678  f1      F       28      2.8    46      1   
789  h1      M       29      2.9    44      1   
900  k1      M       27      3.1    42      0   
123  a1      M       27      3.2    40      0   
234  b1      M       27      3.4    38     -1   
345  c1      F       25      3.5    36     -1"
df1 <- read.table(text = df1, header = TRUE)

df2 <- "ID  NAME        col1   col2 col3
123   a1           0    1   2
234   b1           1    0   1
345   c1           2    2   0
456   d1           0    1   1"
df2 <- read.table(text = df2, header = TRUE)

代码:

df3 <- df1 %>% 
right_join(df2, by = c("ID", "NAME")) #df1 is piped (%>%) into right_join as x, making y = df2.

输出:

#>    ID NAME col1.x col2.x col3.x col4 col5 col1.y col2.y col3.y
#> 1 123   a1      M     20    2.0   56    3      0      1      2
#> 2 234   b1      M     25    2.2   54    3      1      0      1
#> 3 345   c1      F     23    2.3   52    2      2      2      0
#> 4 456   d1      M     24    2.5   50    2      0      1      1
#> 5 123   a1      M     27    3.2   40    0      0      1      2
#> 6 234   b1      M     27    3.4   38   -1      1      0      1
#> 7 345   c1      F     25    3.5   36   -1      2      2      0

reprex package (v0.3.0) 于 2020 年 8 月 16 日创建

【讨论】:

    猜你喜欢
    • 2015-05-12
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多