我试图将几列中的NA变量值设置为不同但命名相似的列中的值。我想知道这是否可能使用dplyr。
作为一个例子,假设我有以下数据帧:
x <- tribble(~x_var1, ~x_var2, ~y_var1, ~y_var2,
5, 2, 0, 0,
NA, 10, 8, 0,
3, NA, 0, 5,
NA, NA, 7, 9)
,我想将x_var1
和x_var2
中的NA
值替换为y_var1
和y_var2
中的相应值。我的数据集有两个以上这样的列,所以我想知道是否有一种简洁的方法可以用mutate(across(...))
或其他dplyr操作来做到这一点。
我的尝试是这样做:
x %>%
mutate(across(c(x_var1, x_var2),
~ ifelse(is.na(.), paste0("y_", str_remove(., "x_")), .))) # if NA replace with y_(varname)
但是这当然不起作用,因为paste
和str_remove
函数没有对变量名进行操作。
提前感谢!
(编辑:我想我可以使用pivot_longer
/pivot_wider
,但我很好奇是否有其他解决方案。)
我认为你在评论中发布的方法是可以的。我们可以简化一下:
library(dplyr)
x <- tribble(~x_var1, ~x_var2, ~y_var1, ~y_var2,
5, 2, 0, 0,
NA, 10, 8, 0,
3, NA, 0, 5,
NA, NA, 7, 9)
x %>%
mutate(across(c(x_var1, x_var2),
~ ifelse(is.na(.),
get(gsub("^x_", "y_", cur_column())),
.)))
#> # A tibble: 4 x 4
#> x_var1 x_var2 y_var1 y_var2
#> <dbl> <dbl> <dbl> <dbl>
#> 1 5 2 0 0
#> 2 8 10 8 0
#> 3 3 5 0 5
#> 4 7 9 7 9
由reprex包(v0.3.0)于2021-02-18创建
在更大的空间中,另一种方法是将purrr::reduce
与自定义函数结合使用。
my_replace_na <- function(df, x) {
mutate(df, !! x := ifelse(is.na(!!sym(x)),
!!sym(gsub("^x_", "y_", x)),
!!sym(x)))
}
x %>%
purrr::reduce(c("x_var1", "x_var2"), my_replace_na, .init = .)