【问题标题】:Using purrr and select to create dichotomous variables使用 purrr 和 select 创建二分变量
【发布时间】:2021-12-18 07:25:30
【问题描述】:

我正在尝试根据所选连续变量的存在(或不存在)创建二分变量列。

例子:

library(tidyverse)

df <- tibble(z = c(0, 0), a_1 = c(.1, NA), a_2 = c(NA, .1))

out <- tibble(z = c(0, 0),
              a_1 = c(.1, NA), 
              a_2 = c(NA, .1), 
              a_1_d = c(1, 0), 
              a_2_d = c(0, 1))

我可以使用 mutate 临时执行此操作:

out <- df %>% 
  mutate(a_1_d = if_else(is.na(a_1), 0, 1)) %>% 
  mutate(a_2_d = if_else(is.na(a_2), 0, 1))

但我的实际用例涉及很多变量,所以我想使用purrrdplyr::select。我尝试了很多方法,例如:

out <- df %>% 
  select(starts_with("a_")) %>% 
  map(.x, .f = mutate({{.x}}_d = 
                        if_else(is.na(.x), 0, 1)))

但我认为我缺少一些关于map 中名称分配和将变量传递给map 的组合的基本知识。使用purrr 函数和dplyr::selectdfout 的最有效方法是什么?

【问题讨论】:

    标签: r dplyr purrr


    【解决方案1】:

    您对mutate()across() 感觉如何?这似乎是解决这类问题的好工具。

    您可以像select() 一样使用整洁的选择功能选择要“跨越”哪些列。然后我们给出我们想要在每一列上使用的函数。你会看到我在 "not NA" (!is.na) 到 0/1 的逻辑输出上使用了 as.numeric(),但你也绝对可以在这里使用 if_else()。我在函数中使用 purrr 风格的 lambda(即 ~)。

    要为要添加到数据集的新列添加后缀,我使用.fns 的命名列表。

    mutate(df, across(.cols = starts_with("a"),
                      .fns = list(d = ~as.numeric(!is.na(.x)))))
    #> # A tibble: 2 x 5
    #>       z   a_1   a_2 a_1_d a_2_d
    #>   <dbl> <dbl> <dbl> <dbl> <dbl>
    #> 1     0   0.1  NA       1     0
    #> 2     0  NA     0.1     0     1
    

    reprex package (v2.0.0) 于 2021-11-03 创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      相关资源
      最近更新 更多