我有像这样的年龄列,它们是虚拟编码的。如何使用 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)
现在,由于@Adam\'s 的评论,一个可能的解决方案names_prefix:
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\nRun Code Online (Sandbox Code Playgroud)\n