将 one-hot 编码变量转换为一列

Eis*_*sen 11 r dplyr

我有像这样的年龄列,它们是虚拟编码的。如何使用 dplyr 将这些列转换为一列?

输入:

  age_0-10 age_11-20 age_21-30 age_31-40 age_41-50 age_51-60 gender
1 0        1         0         0         0         0         0
2 0        0         1         0         0         0         1
3 0        0         0         1         0         0         0
4 0        1         0         0         0         0         1
5 0        0         0         0         0         1         1
Run Code Online (Sandbox Code Playgroud)

预期输出:

age         gender
1 11-20     0
2 21-30     1
3 31-40     0
4 11-20     1
5 51-60     1
Run Code Online (Sandbox Code Playgroud)

Pau*_*ulS 7

现在,由于@Adam\'s 的评论,一个可能的解决方案names_prefix:

\n
library(tidyverse)\n\ndf <- data.frame(\n  check.names = FALSE,\n  `age_0-10` = c(0L, 0L, 0L, 0L, 0L),\n  `age_11-20` = c(1L, 0L, 0L, 1L, 0L),\n  `age_21-30` = c(0L, 1L, 0L, 0L, 0L),\n  `age_31-40` = c(0L, 0L, 1L, 0L, 0L),\n  `age_41-50` = c(0L, 0L, 0L, 0L, 0L),\n  `age_51-60` = c(0L, 0L, 0L, 0L, 1L),\n  gender = c(0L, 1L, 0L, 1L, 1L)\n)\n\ndf %>% \n  pivot_longer(col=starts_with("age"), names_to="age", names_prefix="age_") %>% \n  filter(value==1) %>%\n  select(age, gender, -value)\n\n#> # A tibble: 5 \xc3\x97 2\n#>   age   gender\n#>   <chr>  <int>\n#> 1 11-20      0\n#> 2 21-30      1\n#> 3 31-40      0\n#> 4 11-20      1\n#> 5 51-60      1\n
Run Code Online (Sandbox Code Playgroud)\n