用其他数据框的值替换数据框中的值
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
我有两个数据帧,一旧一新。两个数据帧都包含相同的 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