繁体   English   中英

使用 purrr 和 select 创建二分变量

[英]Using purrr and select to create dichotomous variables

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

例子:

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的最有效方法是什么?

你如何看待mutate()across() 这似乎是解决此类问题的好工具。

您可以像在select()一样,使用整洁的选择函数选择要“跨”工作的列。 然后我们给出我们想要在每一列上使用的函数。 你会看到我用as.numeric()的“不NA”(逻辑输出!is.na )至0/1,但你可以绝对使用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 包( v2.0.0 ) 于 2021 年 11 月 3 日创建

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM