我想使用当前的 dplyr (1.0.2)将NA
开头的v
替换为x
列中的值。代码。
我一栏没问题:
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创建
感谢您的帮助。
答案 0 :(得分:7)
您与across()
非常接近。您想要的方法是:
df %>%
mutate(across(starts_with("v"), coalesce, x))
请注意,coalesce
进入across()
内部,并且x
(coalesce()
的第二个参数可以作为第三个结果。
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)))
在其他情况下,这可以更加灵活(例如,如果.
不是该函数的第一个参数)。