【问题标题】:Paste variable names inside mutate(across())在 mutate(across()) 中粘贴变量名
【发布时间】:2021-02-18 04:00:53
【问题描述】:

我正在尝试将多个列中为 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 但我很好奇是否有其他解决方案。)

【问题讨论】:

  • 我找到了以下线程:stackoverflow.com/questions/61903103/… 这导致了我这个解决方法 - x %>% mutate(across(c(x_var1, x_var2), ~ifelse(is.na(.), pull (x, paste("y_", str_remove(cur_column(), "x_"), sep = "")), .))) 不过很高兴听到其他建议。

标签: r dplyr


【解决方案1】:

我认为您在评论中发布的方法还可以。我们可以稍微简化一下:

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 package (v0.3.0) 于 2021 年 2 月 18 日创建

更大的 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 = .)

【讨论】:

  • @AnilGoyal:谢谢!与此同时,我在 Github 上有 package,它解决了类似的问题。
  • 哦,是的,我注意到你的其他答案中提到了它。
猜你喜欢
  • 2018-11-11
  • 2016-05-22
  • 2012-04-17
  • 1970-01-01
  • 2021-03-01
  • 2021-10-16
  • 1970-01-01
  • 2018-11-14
相关资源
最近更新 更多