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

Fill missing values of dataframe based on value of matching other column with another dataframe while keeping non-matching values

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

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列中用相同的值填充第二个dataframe的NaN。

所以我希望我的 dat2 数据框看起来像:

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

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

我已经尝试了答案 ,但所有这些都删除了 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

虽然我也想保留所有其他值。

我们可以 left_join 'z' 和 coalesce 'val' 列

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