如何用dplyr替换多列中的NA

时间:2020-11-03 17:21:59

标签: r dplyr

我想使用当前的 dplyr (1.0.2)将NA开头的v替换为x列中的值。代码。

here发布了相同的问题,但answer已过时。

我一栏没问题:

suppressMessages(library(dplyr))
df <- data.frame(v1 = c(NA, 1, 2), v2 = c(3, NA, 4), v3 = c(5, 6, NA), x = c(7, 8, 9))
df %>% mutate(v1 = coalesce(v1, x))
#>   v1 v2 v3 x
#> 1  7  3  5 7
#> 2  1 NA  6 8
#> 3  2  4 NA 9

reprex package(v0.3.0)于2020-11-03创建

但无法弄清楚如何使其能够在多列中使用。

以下是我尝试不了的一些事情:

suppressMessages(library(dplyr))
df <- data.frame(v1 = c(NA, 1, 2), v2 = c(3, NA, 4), v3 = c(5, 6, NA), x = c(7, 8, 9))
df %>% mutate(across(starts_with("v")), . = coalesce(., x))
#> Error in list2(...): object 'x' not found

reprex package(v0.3.0)于2020-11-03创建

suppressMessages(library(dplyr))
df <- data.frame(v1 = c(NA, 1, 2), v2 = c(3, NA, 4), v3 = c(5, 6, NA), x = c(7, 8, 9))
df %>% mutate(across(starts_with("v")), . = coalesce(., df$x))
#> Error: Can't combine `..1` <data.frame> and `..2` <double>.

reprex package(v0.3.0)于2020-11-03创建

感谢您的帮助。

1 个答案:

答案 0 :(得分:7)

您与across()非常接近。您想要的方法是:

df %>%
  mutate(across(starts_with("v"), coalesce, x))

请注意,coalesce进入across()内部,并且xcoalesce()的第二个参数可以作为第三个结果。

  v1 v2 v3 x
1  7  3  5 7
2  1  8  6 8
3  2  4  9 9

如果您更喜欢使用coalesce(., x)的方法,也可以使用~将其作为匿名函数传递:

df %>%
  mutate(across(starts_with("v"), ~ coalesce(., x)))

在其他情况下,这可以更加灵活(例如,如果.不是该函数的第一个参数)。