r-基于两列匹配的另一个数据帧覆盖数据帧中的值



我有一个数据帧,其中第一列有日期,第二列有ID,其他列有值。如果第1列和第2列匹配,那么一列(比如第三列(中的一些值应该基于另一个数据帧进行upload或插入。但是,并非两个数据帧中的所有列都相同。

覆盖选定列中的值和将一个数据帧中的行匹配到另一个数据框R中有一个解决方案,但它不适用于不同大小的2列或数据帧。

以下是一些示例数据,以使我需要的清晰

df1=structure(list(Date = structure(c(19216, 19216, 19219, 19219), class = "Date"), 
ID = c("id1", "id2", "id1", "id2"), X1 = c(-8, -10, 5, 11
), X2 = c(0, 0, 0, 0), X3 = c("A", "A", "A", "A")), row.names = c(NA, 
-4L), class = "data.frame")
df2=structure(list(Date = structure(c(19216, 19219, 19220), class = "Date"), 
ID = c("id1", "id1", "id1"), X1 = c(-3, 0, 2), Y = c(2, 2, 
-1)), class = "data.frame", row.names = c(NA, -3L))
df_result=structure(list(Date = structure(c(19216, 19216, 19219, 19219, 
19220), class = "Date"), ID = c("id1", "id2", "id1", "id2", "id1"
), X1 = c(-3, -10, 0, 11, 2), X2 = c(0, 0, 0, 0, NA), X3 = c("A", 
"A", "A", "A", NA)), row.names = c(NA, 5L), class = "data.frame")

您可以使用dplyr::rows_upsert更新第一个数据帧中的现有行并添加新的行。只需确保两个数据帧具有相同的列,并且第二个数据帧中没有重复项。您尝试更新的密钥应该是唯一的

library(dplyr)
df_result2 = rows_upsert(df1, select(df2, -Y), by = c("Date", "ID"))
print(df_result2)
Date  ID  X1 X2   X3
1 2022-08-12 id1  -3  0    A
2 2022-08-12 id2 -10  0    A
3 2022-08-15 id1   0  0    A
4 2022-08-15 id2  11  0    A
5 2022-08-16 id1   2 NA <NA>

这似乎奏效了。

最新更新