我有一个数据集,其中许多变量实际上是“一个热编码”的一种,我希望将其折叠为一个带有值的变量。
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
我看着dplyr
和tidyr
周围,但是我不知何故找不到我需要的东西。
ps:我必须对许多变量执行此操作,因此易于推广的解决方案或使用管道将非常有帮助
答案 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])]