gpt4 book ai didi

r - 在 mutate(across()) 中粘贴变量名

转载 作者:行者123 更新时间:2023-12-04 08:05:01 26 4
gpt4 key购买 nike

我试图将几列中为 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)
我想用 NAx_var1 中的相应值替换 x_var2y_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)
但当然这不起作用,因为 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
创建于 2021-02-18 由 reprex package (v0.3.0)

较大的 tidyverse 中的另一种方法是使用 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 = .)

关于r - 在 mutate(across()) 中粘贴变量名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66253414/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com