“还原”一种热编码

时间:2019-04-10 08:21:40

标签: r

我有一个数据集,其中许多变量实际上是“一个热编码”的一种,我希望将其折叠为一个带有值的变量。

  name  born_2017 born_2018 born_2019
  <chr>     <dbl>     <dbl>     <dbl>
1 Paul          0         1         0
2 Diane         0         0         1
3 Jose          1         0         0

我希望它看起来像这样:

  name  birth_year
  <chr> <chr>     
1 Paul  born_2018 
2 Diane born_2019 
3 Jose  born_2017

我看着dplyrtidyr周围,但是我不知何故找不到我需要的东西。

ps:我必须对许多变量执行此操作,因此易于推广的解决方案或使用管道将非常有帮助

2 个答案:

答案 0 :(得分:0)

您可以使用gather

library(dplyr)
df %>%
  gather(birth_year ,flag , born_2017:born_2018) %>%
  filter(flag == 1) %>%
  select(-flag)

答案 1 :(得分:0)

example <- read.table(text = "
name  born_2017 born_2018 born_2019

 Paul          0         1         0
 Diane         0         0         1
 Jose          1         0         0", h = T)

在这个特定示例中,这也可以只使用基数R:

example$birth_year <- colnames(example[,2:4])[apply(example[,2:4], 1, which.max)]

example[,c("name", "birth_year")]
   name birth_year
1  Paul  born_2018
2 Diane  born_2019
3  Jose  born_2017

根据Sotos的建议,以下两种方法是矢量化的,不需要apply并且更密集,因此更可取:

subset(cbind(example[1], stack(example[-1])), values == 1) 

 names(example[-1])[max.col(example[-1])]