[英]How to use map from purrr with dplyr::mutate to create multiple new columns based on column pairs
[英]How to create multiple columns from combination of pairs of another column?
我正在尝试创建多个列,这些列是基于另一列的对组合。 例如,在这个简化的forcats::gss_cat
数据集中,有一个marital
列具有三个值: Separated
、 Divorced
和Married
。 我可以使用mutate
和case_when
创建新的列,例如Separated_Divorced
,如下所示:
简化数据集
data <- forcats::gss_cat %>%
filter(marital != "No answer") %>%
filter(marital != "Never married") %>%
filter(marital != "Widowed")
data %>% count(marital)
marital n
Separated 743
Divorced 3383
Married 10117
基于对手动创建列
Separated_Divorced
_离婚 , Divorced_Married
_已婚 , Married_Separated
data <- data %>%
mutate(Separated_Divorced = case_when(marital == "Separated" ~ "Separated",
marital == "Divorced" ~ "Divorced"),
Divorced_Married = case_when(marital == "Divorced" ~ "Divorced",
marital == "Married" ~ "Married"),
Married_Separated = case_when(marital == "Married" ~ "Married",
marital == "Separated" ~ "Separated"))
是否有 function 或一种简单的方法来创建这些列而无需手动创建与这种方法不同的列?
我们可以在“婚姻”的levels
上使用combn
library(dplyr)
library(stringr)
data2 <- combn(levels(data$marital), 2, FUN = \(x)
data %>%
transmute(!! str_c(x, collapse="_") :=
case_when(as.character(marital) %in% x~ as.character(marital))),
simplify = FALSE) %>%
bind_cols(data, .)
-输出
> head(data2, 2)
# A tibble: 2 × 24
year marital age race rincome partyid relig denom tvhours `No answer_Neve… `No answer_Sepa… `No answer_Divo… `No answer_Wido… `No answer_Marr… `Never married_…
<int> <fct> <int> <fct> <fct> <fct> <fct> <fct> <int> <chr> <chr> <chr> <chr> <chr> <chr>
1 2000 Divorced 48 White $8000 to 9999 Not st… Prot… Bapt… NA <NA> <NA> Divorced <NA> <NA> <NA>
2 2000 Divorced 25 White Not applicable Not st… None Not … 1 <NA> <NA> Divorced <NA> <NA> <NA>
# … with 9 more variables: Never married_Divorced <chr>, Never married_Widowed <chr>, Never married_Married <chr>, Separated_Divorced <chr>,
# Separated_Widowed <chr>, Separated_Married <chr>, Divorced_Widowed <chr>, Divorced_Married <chr>, Widowed_Married <chr>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.