如何使用多列作为键合并两个数据框?
How to merge two dataframes using multiple columns as key?
假设我有以下数据帧:
DF1 <- data.frame("A" = rep(c("A","B"), 18),
"B" = rep(c("C","D","E"), 12),
"NUM"= rep(rnorm(36,10,1)),
"TEST" = rep(NA,36))
DF2 <- data.frame("A" = rep("A",6),
"B" = rep(c("C","D"),6),
"VAL" = rep(c(1,3),3))
*注意:DF2
中变量 A
和 B
的每个唯一组合都应该有一个唯一的 VAL
。
对于每一行,如果列中的值 [=11],我想用 DF1
中 VAL
的相应值替换 TEST
中的 NA
=] 和 A
匹配,并且 B
和 B
列中的值与该行匹配。否则,我会将 TEST
保留为 NA
。如果不使用匹配遍历每个组合,我将如何做到这一点?
理想情况下,一个答案将扩展到两个数据框,其中有许多要匹配的列。
# this is your DF1
DF1 <- data.frame("A" = rep(c("A","B"), 18),
"B" = rep(c("C","D","E"), 12),
"NUM"= rep(rnorm(36,10,1)),
"TEST" = rep(NA,36))
#this is a DF2 i created, with unique A, B, VAL
DF2 <- data.frame("A" = rep(c("A","B"),3),
"B" = rep(c("C","D","E"),2),
"VAL" = rep(1:6))
# and this is the answer of what i assume you want
tmp <- merge(DF1,DF2, by=c("A","B"), all.x=TRUE, all.y=FALSE)
DF1[4] <- tmp[5]
正如 Akrun 在评论中提到的,您的查找 table (DF2) 需要减少到只有它独特的 A/B 组合。对于您当前的数据框,这不是问题,但如果同一组合有多个可能的值,您将需要额外的规则。从那里开始,解决方案很简单:
DF2.u <- unique(DF2)
DF3 <- merge(DF1, DF2.u, all = T)
请注意,这将生成一个新的数据框,其中包含一个空的 TEST 列(所有值 NA
)和一个从 DF2 分配的 VAL 列。要完全按照您的意愿进行操作(尽可能将 TEST 替换为 VAL),这里有一些稍微笨拙的代码:
DF1$TEST <- merge(DF1, DF2.u, all = T)$VAL
编辑:针对您的问题,如果需要,您可以非常简单地归结 DF2:
DF2$C <- c(1:12) #now unique() won't work
DF2.u <- unique(DF2[1:3])
A B VAL
1 A C 1
2 A D 3
假设我有以下数据帧:
DF1 <- data.frame("A" = rep(c("A","B"), 18),
"B" = rep(c("C","D","E"), 12),
"NUM"= rep(rnorm(36,10,1)),
"TEST" = rep(NA,36))
DF2 <- data.frame("A" = rep("A",6),
"B" = rep(c("C","D"),6),
"VAL" = rep(c(1,3),3))
*注意:DF2
中变量 A
和 B
的每个唯一组合都应该有一个唯一的 VAL
。
对于每一行,如果列中的值 [=11],我想用 DF1
中 VAL
的相应值替换 TEST
中的 NA
=] 和 A
匹配,并且 B
和 B
列中的值与该行匹配。否则,我会将 TEST
保留为 NA
。如果不使用匹配遍历每个组合,我将如何做到这一点?
理想情况下,一个答案将扩展到两个数据框,其中有许多要匹配的列。
# this is your DF1
DF1 <- data.frame("A" = rep(c("A","B"), 18),
"B" = rep(c("C","D","E"), 12),
"NUM"= rep(rnorm(36,10,1)),
"TEST" = rep(NA,36))
#this is a DF2 i created, with unique A, B, VAL
DF2 <- data.frame("A" = rep(c("A","B"),3),
"B" = rep(c("C","D","E"),2),
"VAL" = rep(1:6))
# and this is the answer of what i assume you want
tmp <- merge(DF1,DF2, by=c("A","B"), all.x=TRUE, all.y=FALSE)
DF1[4] <- tmp[5]
正如 Akrun 在评论中提到的,您的查找 table (DF2) 需要减少到只有它独特的 A/B 组合。对于您当前的数据框,这不是问题,但如果同一组合有多个可能的值,您将需要额外的规则。从那里开始,解决方案很简单:
DF2.u <- unique(DF2)
DF3 <- merge(DF1, DF2.u, all = T)
请注意,这将生成一个新的数据框,其中包含一个空的 TEST 列(所有值 NA
)和一个从 DF2 分配的 VAL 列。要完全按照您的意愿进行操作(尽可能将 TEST 替换为 VAL),这里有一些稍微笨拙的代码:
DF1$TEST <- merge(DF1, DF2.u, all = T)$VAL
编辑:针对您的问题,如果需要,您可以非常简单地归结 DF2:
DF2$C <- c(1:12) #now unique() won't work
DF2.u <- unique(DF2[1:3])
A B VAL
1 A C 1
2 A D 3