“tidyr like”从不同的列中填充 na

Adi*_*ger 2 r dplyr tidyr tidyverse

我有一个缺失值的数据框是一些列(谁没有)。例如:

df <- data.frame(x = c(2,NA,4), y = 5:7)
df
   x y
1  2 5
2 NA 6
3  4 7
Run Code Online (Sandbox Code Playgroud)

我想用不同列的值替换缺失值。显然有很多方法可以做到这一点,例如:

 df %>%
   mutate(x = ifelse(is.na(x), y, x))

  x y
1 2 5
2 6 6
3 4 7
Run Code Online (Sandbox Code Playgroud)

但是,我正在寻找更优雅的东西,比如

df %>% fill(x,y) 
Run Code Online (Sandbox Code Playgroud)

但找不到任何东西。这样的东西存在吗?

谢谢!

Gre*_*gor 6

您希望更改单个列中的值,同时保持相同的行数。做到这一点的 tidyverse 方法是dplyr::mutate,您想要的特定操作的 tidyverse 实现是dplyr::coalesce,正如 docendo discimus 建议的那样:

df %>% mutate(x = coalesce(x, y))
Run Code Online (Sandbox Code Playgroud)

如果有一个函数将这两个步骤组合在一起,事情就会变得不那么整洁和不那么一致,因为它不是正在操作的整个数据框,只是一个列。它也不太灵活,因为coalesce可以用于向量,无论它们是否在数据框中,这很好!


(我实际上不喜欢tidyr::fill- 我认为它是一致的,因为它对数据框的所有列进行操作,但我更喜欢它采用单个向量并且通常在mutate.内使用。mutate_all(fill)将很容易完成整个数据框。所以我最终仍然依赖zoo::na.locf于一般用途。)