R语言 如何在不重复公共列的情况下合并具有两个键列的三个数据集?

a14dhokn  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(132)

我有一个大的数据集,我需要从其他两个较小的数据集的信息完成。大型数据集就像

df_large <- data.frame(letters = letters[1:5],
                       numbers = 1:5,
                       client = c("client1", "client2", "client3", "client4", "client4"),
                       other = c("other1", "other2", "other1", "other4", "other4")
                       )

这将由来自其他两个较小数据集的信息完成,

df2 <- data.frame(numbers = 1:3,
                  info = c("info1", "info2", "info3"),
                  invoice = c(100, 150, 200))

df3 <- data.frame(letters = letters[4:5],
                  info = c("info4", "info5"),
                  product = c("phone", "laptop"))

我需要合并两个较小的数据集,并使用它们来完成最大数据集中的信息。问题是两个表的键不一样:一个具有变量numbers,另一个具有变量letters。所以我希望得到这样的结果:

# A tibble: 5 × 6
  letters numbers client  other  info  product
  <chr>     <int> <chr>   <chr>  <chr> <chr>  
1 a             1 client1 other1 info1    NA     
2 b             2 client2 other2 info2    NA     
3 c             3 client3 other1 info3    NA     
4 d             4 client4 other4 info4    phone  
5 e             5 client4 other4 info5    laptop

我尝试的是:首先,我执行了left_join(df_large, df2),它工作得很好,并使用这两个表生成了预期的结果。然而,当加入第三个时,缺少一些信息:

test_table <- left_join(df_large, df2)  #this works well
result <- left_join(test_table, df3,
                    by = "letters")

上面的代码生成了一个表,其中df2df3中的公共列被重命名为info.xinfo.y,而不是合并,如下所示:

# A tibble: 5 × 8
  letters numbers client  other  info.x invoice info.y product
  <chr>     <int> <chr>   <chr>  <chr>    <dbl> <chr>  <chr>  
1 a             1 client1 other1 info1      100 NA     NA     
2 b             2 client2 other2 info2      150 NA     NA     
3 c             3 client3 other1 info3      200 NA     NA     
4 d             4 client4 other4 NA          NA info4  phone  
5 e             5 client4 other4 NA          NA info5  laptop

如何将公共列保留为公共列而不丢失任何信息?

67up9zun

67up9zun1#

df_large连接到df2后,只需从另一个表中填充NA值。解决这个问题的一种方法是使用dplyr::rows_update()
rows_update()修改现有的行(类似于UPDATE [在SQL中])。y中的键值必须是唯一的,默认情况下,y中的键值必须存在于x中。

df_large |>
    left_join(df2, by = "numbers") |>
    mutate(product = NA_character_) |>
    rows_update(df3, by = "letters")

#   letters numbers  client  other  info invoice product
# 1       a       1 client1 other1 info1     100    <NA>
# 2       b       2 client2 other2 info2     150    <NA>
# 3       c       3 client3 other1 info3     200    <NA>
# 4       d       4 client4 other4 info4      NA   phone
# 5       e       5 client4 other4 info5      NA  laptop

相关问题