根据将其他列与另一个数据框匹配的值来填充数据框的缺失值

时间:2020-07-26 13:17:47

标签: r dataframe match

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

    dat1 <- data.frame(z = 1:20, val = seq(10, 105, by = 5))
    dat2 <- data.frame(z = seq(1, 20, by = 5), val = c(10, 20, 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最小值的值,我也需要保留这些最小值。现在结果如下:

dat2
z val
8 40
10 50
12 65
15 80

1 个答案:

答案 0 :(得分:1)

这应该有效:

library(dplyr)
inner_join(dat2, dat1, by = "z") %>% 
  mutate(answer = coalesce(val.x, val.y))

内部联接尝试根据键(按值)匹配数据集。如果可以在两个表中找到记录,则保留该记录。 %>%是一个“管道”,表示获取此数据集并将其提供给下一个函数。 mutate用于在R的tidyverse方言中创建一个新变量。Coalesce返回第一个不丢失的值。因此,如果没有缺少val.x,则使用它;如果缺少,则使用val.y。

编辑:

尝试一下:

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

all_z <- tibble(z = sort(union(dat1$z, dat2$z)))

library(dplyr)

left_join(all_z, dat1, by = "z") %>% 
    left_join(dat2, by = "z") %>% 
    mutate(answer = coalesce(val.x, val.y)) %>% 
    select(z, answer)

要查看其工作原理,请在没有%>%的情况下按顺序运行各行。例如,尝试:

left_join(all_z, dat1, by = "z")

然后尝试

left_join(all_z, dat1, by = "z") %>% 
    left_join(dat2, by = "z")