R合并到位
我希望能够更新合并中的现有变量,而不是添加。有人能用base 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
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