r语言 - 在mutate(across())内粘贴变量名



我试图将几列中的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_var1x_var2中的NA值替换为y_var1y_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)

但是这当然不起作用,因为pastestr_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 = .)

最新更新