簡體   English   中英

根據由兩列匹配的另一個 Dataframe 覆蓋 Dataframe 中的值

[英]Overwrite values in Dataframe based on another Dataframe matched by two columns

我有一個 dataframe ,其中第一列有日期,第二列有 ID,其他列有值。 如果第 1 列和第 2 列匹配,則應根據另一列 dataframe 更新或插入一列中的某些值,例如第三列。 但是,並非兩個數據框中的所有列都相同。

覆蓋選定列的值並將一個數據幀中的行匹配到另一個數據幀 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更新第一個數據框中的現有行並添加新行。 只需確保兩個數據幀具有相同的列,並且第二個 dataframe 中沒有重復項。 您嘗試更新的密鑰應該是唯一的

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>

這似乎有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM