用其他数据框的值替换数据框中的值

Replace values in a dataframe by values of other dataframe

我有两个数据帧,一旧一新。两个数据帧都包含相同的 ID,但列中的值在数据帧之间可能不同。旧数据框包含 'correct' 值,因此需要在新信息中替换。

这是旧数据框:

structure(list(ID = c(1, 2, 3, 4, 5, 6, 7), a = c("hi", "ho", 
NA, "hu", "ha", NA, "he"), b = c(1, 1, NA, 1, 1, NA, 1), c = c("ri", 
"ro", NA, "ru", NA, NA, "re"), d = c(2, 2, NA, 2, NA, NA, 2)), row.names = c(NA, 
-7L), class = c("tbl_df", "tbl", "data.frame"))

 ID a         b c         d

 1 hi        1 ri        2
 2 ho        1 ro        2
 3 NA       NA NA       NA
 4 hu        1 ru        2
 5 ha        1 NA       NA
 6 NA       NA NA       NA
 7 he        1 re        2

这是新的数据框:

structure(list(ID = c(1, 2, 3, 4, 5, 6, 7, 10, 11), a = c("hi", 
"ho", NA, "hu", "ha", NA, "he", "hii", "hoo"), b = c(3, 1, NA, 
1, 1, NA, 1, 1, 1), c = c("ri", "ro", NA, "ru", "ra", NA, "re", 
NA, "roo"), d = c(3, 2, NA, 2, 2, NA, 2, NA, 2)), row.names = c(NA, 
-9L), class = c("tbl_df", "tbl", "data.frame"))

  ID a         b c         d
     1 hi        3 ri        3
     2 ho        1 ro        2
     3 NA       NA NA       NA
     4 hu        1 ru        2
     5 ha        1 ra        2
     6 NA       NA NA       NA
     7 he        1 re        2
    10 hii       1 NA       NA
    11 hoo       1 roo       2

旧df中的ID包含在新df中,但在新df中也有新ID。这些需要包含在最终输出中。 新 df 中不同的值需要替换为旧 df 中的值。此外,可以在列中添加新数据(ID 号 5 在列 c 和 d 中有新数据)。这些也需要包含在最终输出中。

最终输出应如下所示:

structure(list(ID = c(1, 2, 3, 4, 5, 6, 7, 10, 11), a = c("hi", 
"ho", NA, "hu", "ha", NA, "he", "hii", "hoo"), b = c(1, 1, NA, 
1, 1, NA, 1, 1, 1), c = c("ri", "ro", NA, "ru", "ra", NA, "re", 
NA, "roo"), d = c(2, 2, NA, 2, 2, NA, 2, NA, 2)), row.names = c(NA, 
-9L), class = c("tbl_df", "tbl", "data.frame"))



  ID a         b c         d
     1 hi        1 ri        2
     2 ho        1 ro        2
     3 NA       NA NA       NA
     4 hu        1 ru        2
     5 ha        1 ra        2
     6 NA       NA NA       NA
     7 he        1 re        2
    10 hii       1 NA       NA
    11 hoo       1 roo       2

任何人都可以帮助实现这个目标吗?我看过函数 match 但这似乎只适用于某些列。

非常感谢!

调用第一个样本 df old_df,调用第二个样本 new_df。听起来基本上您想用 old_df 中的值更新 new_df 中的行,保留 new_df 中的所有 non-matching 行:

library(dplyr)
new_df %>% rows_update(old_df, by = "ID")

给出:

# A tibble: 9 x 5
     ID a         b c         d
  <dbl> <chr> <dbl> <chr> <dbl>
1     1 hi        1 ri        2
2     2 ho        1 ro        2
3     3 NA       NA NA       NA
4     4 hu        1 ru        2
5     5 ha        1 NA       NA
6     6 NA       NA NA       NA
7     7 he        1 re        2
8    10 hii       1 NA       NA
9    11 hoo       1 roo       2