根据匹配其他列与另一个数据框的值来填充数据框的缺失值,同时保持不匹配的值

时间:2020-07-27 16:44:42

标签: r dataframe matching

我有两个看起来像这样的数据框:

dat1 <- data.frame(z = 5:20, val = seq(30, 105, by = 5))
dat2 <- data.frame(z = c(0, 2, 8, 10, 12, 15), val = c(15, 20, 40, 50, NaN, NaN))

外观如下:

dat1        dat2
 z val      z val
 5  30      0  15
 6  35      2  20
 7  40      8  40
 8  45      10 50  
 9  50      12 NaN 
10  55      15 NaN
11  60     
12  65
13  70
14  75
15  80
16  85
17  90
18  95
19 100
20 105

我想要的是在z值相同的val列中用相同的值填充第二个数据帧的NaN。

所以我希望我的dat2数据帧看起来像这样:

dat2
z val
0 15
2 20
8 40
10 50
12 65
15 80

我考虑过要获取NaN值的索引,但是它们并不重叠。我需要以某种方式将它们与z列匹配,但用这些值填写NaN列。我真的不知道该怎么做。

我尝试了答案here,但是所有这些都删除了dat2中所有低于dat1最小值的值,我也需要保留这些值。

我到目前为止正在使用的代码:

  filled <- inner_join(dat2, dat1, by = "z") %>% 
    mutate(answer = coalesce(val.x, val.y))

但是,现在的结果如下:

dat2
z val
8 40
10 50
12 65
15 80

同时我还要保留所有其他值。

1 个答案:

答案 0 :(得分:2)

我们可以通过'z'和left_join的'val'列来进行coalesce

library(dplyr)
left_join(dat2, dat1, by = 'z') %>% 
       transmute(z, val = coalesce(val.x, val.y))
#   z val
#1  0  15
#2  2  20
#3  8  40
#4 10  50
#5 12  65
#6 15  80