我正在嘗試根據所選連續變數的存在(或不存在)創建二分變數列。
例子:
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))
但是我的實際用例涉及很多變數,所以我想使用purrrand dplyr::select。我嘗試了很多方法,例如:
out <- df %>%
select(starts_with("a_")) %>%
map(.x, .f = mutate({{.x}}_d =
if_else(is.na(.x), 0, 1)))
但我認為我遺漏了一些關于名稱分配map和將變數傳遞給map. 從使用函式df到out使用purrr函式的最有效方法是什么dplyr::select?
uj5u.com熱心網友回復:
如何你覺得mutate()有across()?這似乎是解決此類問題的好工具。
您可以使用整潔的選擇功能選擇要“跨”作業的列,就像在select(). 然后我們給出我們想要在每一列上使用的函式。您會看到我as.numeric()在“not 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 日創建
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/347579.html
