[英]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))
但是我的实际用例涉及很多变量,所以我想使用purrr
和dplyr::select
。 我尝试了很多方法,例如:
out <- df %>%
select(starts_with("a_")) %>%
map(.x, .f = mutate({{.x}}_d =
if_else(is.na(.x), 0, 1)))
但我认为我缺少一些关于map
中名称分配和将变量传递给map
一些基本组合。 使用purrr
函数和dplyr::select
从df
到out
的最有效方法是什么?
你如何看待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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.