在df2
中,我想基于两个数据帧之间的列d
和b
中的匹配记录来填充列c
中的空白。什么是快速而优雅的方法呢?重要的是要提到它在匹配的行在两个数据帧中可能具有不同位置的情况下应该能很好地工作。
df1 <- data.frame( a = c(1,1,1,1,1,2,2,2,2,2) ,b = rep(seq(41,45,1),each=2), c = c(101:105,101:105), d = LETTERS[seq( from = 1, to = 10 )])
df2 <- data.frame( a = c(1,1,1,1,1,2,2,2,2,2) ,b = rep(seq(41,45,1),each=2), c = c(101:105,101:105), d = c(LETTERS[seq( from = 1, to = 6 )],rep(NA,4)))
> df1
a b c d
1 1 41 101 A
2 1 41 102 B
3 1 42 103 C
4 1 42 104 D
5 1 43 105 E
6 2 43 101 F
7 2 44 102 G
8 2 44 103 H
9 2 45 104 I
10 2 45 105 J
> df2
a b c d
1 1 41 101 A
2 1 41 102 B
3 1 42 103 C
4 1 42 104 D
5 1 43 105 E
6 2 43 101 F
7 2 44 102 <NA>
8 2 44 103 <NA>
9 2 45 104 <NA>
10 2 45 105 <NA>
结果应为:
a b c d
1 1 41 101 A
2 1 41 102 B
3 1 42 103 C
4 1 42 104 D
5 1 43 105 E
6 2 43 101 F
7 2 44 102 G
8 2 44 103 H
9 2 45 104 I
10 2 45 105 J
答案 0 :(得分:0)
虽然您可以使用match
甚至%in%
进行查找,但我认为另一种(健壮)的方法是使用合并/联接:
df2mod <- merge(df2, df1[,c('b','c','d')], by = c("b", "c"), all=TRUE)
df2mod
# b c a d.x d.y
# 1 41 101 1 A A
# 2 41 102 1 B B
# 3 42 103 1 C C
# 4 42 104 1 D D
# 5 43 101 2 F F
# 6 43 105 1 E E
# 7 44 102 2 <NA> G
# 8 44 103 2 <NA> H
# 9 45 104 2 <NA> I
# 10 45 105 2 <NA> J
在这种情况下,d.x
是原始的df2$d
。由于您的数据是factor
,因此需要一些额外的部分(as.character
和re factor
)。
df2mod$d <- with(df2mod, ifelse(is.na(d.x), as.character(d.y), as.character(d.x)))
df2mod$d <- factor(df2mod$d, levels = levels(df1$d))
df2mod
# b c a d.x d.y d
# 1 41 101 1 A A A
# 2 41 102 1 B B B
# 3 42 103 1 C C C
# 4 42 104 1 D D D
# 5 43 101 2 F F F
# 6 43 105 1 E E E
# 7 44 102 2 <NA> G G
# 8 44 103 2 <NA> H H
# 9 45 104 2 <NA> I I
# 10 45 105 2 <NA> J J
df2mod[,c("d.x", "d.y")] <- NULL # cleanup unnecessary columns