如何替换R中列中的数据?

RL_*_*Pug 2 r dplyr

所以我有一个名为“myData”的数据框

print(myData) 

ID       Name      Status       AGE 
123      Mike        Yes         18
124      John        No          20
125      Lily        Yes         21
126      Jasper      No          24
127      Toby        Yes         27 
128      Will        No          19 
129      Oscar       Yes         32

Run Code Online (Sandbox Code Playgroud)

我收到了一个更新的数据框,它更新了名为“myData2”的“状态”。这个数据框的观察比我原来的少,只有 ID 和状态。

这是更新后的数据框

print(myData2) 

ID      Status        
123      Yes                  
125      Yes         
126      Yes                  
128      No          
129      No

Run Code Online (Sandbox Code Playgroud)

是否有功能可以使用列“ID”使用 myData2 中的数据更新 myData 中的“状态”列?

这是我想要的输出

ID       Name      Status       AGE 
123      Mike        Yes         18
124      John        No          20
125      Lily        Yes         21
126      Jasper      Yes         24
127      Toby        Yes         27 
128      Will        No          19 
129      Oscar       No          32   

Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

我们可以使用data.tablejoin在加入on'ID'后使用第二个值快速更新第一个数据集'Status '

library(data.table)
setDT(myData)[myData2, Status := i.Status, on = .(ID)]
myData
#    ID   Name Status AGE
#1: 123   Mike    Yes  18
#2: 124   John     No  20
#3: 125   Lily    Yes  21
#4: 126 Jasper    Yes  24
#5: 127   Toby    Yes  27
#6: 128   Will     No  19
#7: 129  Oscar     No  32
Run Code Online (Sandbox Code Playgroud)

在 中dplyr,我们执行 aleft_join然后coalesce是“状态”列

library(dplyr)
myData %>% 
    left_join(myData2, by = 'ID') %>% 
     mutate(Status = coalesce(Status.y, Status.x)) %>% 
     select(-Status.x, -Status.y)
Run Code Online (Sandbox Code Playgroud)

数据

myData <- structure(list(ID = 123:129, Name = c("Mike", "John", "Lily", 
"Jasper", "Toby", "Will", "Oscar"), Status = c("Yes", "No", "Yes", 
"No", "Yes", "No", "Yes"), AGE = c(18L, 20L, 21L, 24L, 27L, 19L, 
32L)), class = "data.frame", row.names = c(NA, -7L))

myData2 <- structure(list(ID = c(123L, 125L, 126L, 128L, 129L), Status = c("Yes", 
"Yes", "Yes", "No", "No")), class = "data.frame", row.names = c(NA, 
-5L))
Run Code Online (Sandbox Code Playgroud)