R合并到位

R合并到位,r,replace,merge,R,Replace,Merge,我希望能够更新合并中的现有变量,而不是添加。有人能用base R命令帮助完成这项任务吗?以下是一个例子: A1 <-c("0ZERO","1ONE","2TWO","3THREE","4FOUR") A2 <-c("5FIVE","6SIX","7SEVEN","8EIGHT","9NINE") B <-c("1ONE","2TWO","3THREE") C <-c("5FIVE","7SEVEN","8EIGHT") X <-c(1.2,1.3,1.4) mas

我希望能够更新合并中的现有变量,而不是添加。有人能用base R命令帮助完成这项任务吗?以下是一个例子:

A1 <-c("0ZERO","1ONE","2TWO","3THREE","4FOUR")
A2 <-c("5FIVE","6SIX","7SEVEN","8EIGHT","9NINE")
B <-c("1ONE","2TWO","3THREE")
C <-c("5FIVE","7SEVEN","8EIGHT")
X <-c(1.2,1.3,1.4)

master.df<-data.frame(A1,A2)
slave1.df<-data.frame(B,X)

X<-c(2.1,2.1,2.3)
slave2.df<-data.frame(C,X)

注意
NA
仍然存在。由于我的设置,我需要能够做到这一点是基本
R
(但如果人们认为这是完成此任务的最佳方式,我可以请求安装软件包)。谢谢。

您可以尝试一种
tidyverse
解决方案

library(tidyverse)
master.df %>% 
 left_join(slave1.df, by = c("A1" = "B")) %>% 
 left_join(slave2.df, by = c("A2" = "C")) %>% 
  mutate(X = ifelse(is.na(X.x), X.y, X.x)) %>% 
  select(1:2, X)
      A1     A2   X
1  0ZERO  5FIVE 2.1
2   1ONE   6SIX 1.2
3   2TWO 7SEVEN 1.3
4 3THREE 8EIGHT 1.4
5  4FOUR  9NINE  NA
在base R中,您可以尝试

master.df[is.na(master.df$X),3] <- merge(master.df[is.na(master.df$X),],slave2.df,by.x="A2",by.y="C",all.x=TRUE)[,4]
master.df
      A1     A2   X
1  0ZERO  5FIVE 2.1
2   1ONE   6SIX 1.2
3   2TWO 7SEVEN 1.3
4 3THREE 8EIGHT 1.4
5  4FOUR  9NINE  NA

master.df[is.na(master.df$X),3]可能
ind=is.na(master.df$X);master.df[ind,“X”]最后我选择了这个解决方案。事实上,我有很多“X”,这看起来是最合适的。在具有一百万行的数据框上快速工作。
Warning messages:
 1: In `[<-.data.frame`(`*tmp*`, is.na(master.df$X), , value = list( :
   provided 4 variables to replace 3 variables
 2: In `[<-.factor`(`*tmp*`, iseq, value = c(1L, 5L)) :
   invalid factor level, NA generated
 3: In `[<-.factor`(`*tmp*`, iseq, value = c(1L, 5L)) :
   invalid factor level, NA generated
head(master.df)
     A1     A2   X
1  0ZERO  5FIVE 2.1
2   1ONE   6SIX 1.2
3   2TWO 7SEVEN 1.3
4 3THREE 8EIGHT 1.4
5  4FOUR  9NINE  NA
library(tidyverse)
master.df %>% 
 left_join(slave1.df, by = c("A1" = "B")) %>% 
 left_join(slave2.df, by = c("A2" = "C")) %>% 
  mutate(X = ifelse(is.na(X.x), X.y, X.x)) %>% 
  select(1:2, X)
      A1     A2   X
1  0ZERO  5FIVE 2.1
2   1ONE   6SIX 1.2
3   2TWO 7SEVEN 1.3
4 3THREE 8EIGHT 1.4
5  4FOUR  9NINE  NA
master.df[is.na(master.df$X),3] <- merge(master.df[is.na(master.df$X),],slave2.df,by.x="A2",by.y="C",all.x=TRUE)[,4]
master.df
      A1     A2   X
1  0ZERO  5FIVE 2.1
2   1ONE   6SIX 1.2
3   2TWO 7SEVEN 1.3
4 3THREE 8EIGHT 1.4
5  4FOUR  9NINE  NA