Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R &引用;“回复”;一个热编码_R - Fatal编程技术网

R &引用;“回复”;一个热编码

R &引用;“回复”;一个热编码,r,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

我有一个数据集,其中许多变量实际上是“一个热编码的”,我想把它折叠成一个带值的变量

  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
姓名2017年出生2018年出生2019年出生
1保罗0 1 0
2黛安0 1
3何塞100
我希望它看起来像这样:

  name  birth_year
  <chr> <chr>     
1 Paul  born_2018 
2 Diane born_2019 
3 Jose  born_2017
姓名出生年份
1 Paul born_2018
2 Diane born_2019
3 Jose born_2017
我看了看周围的
dplyr
tidyr
,但不知怎么的,我没有找到我需要的东西


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

您可以使用
聚集

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


“编码”会发生什么变化。它是被丢弃的吗?@NelsonGon这不是同一个问题,我不想在结尾处得到更多的行。正如它目前所写的,这是同一个问题。0和1怎么了?!我考虑过这一点,但事实上,我必须使用一个标志,向代码中添加许多行,因为我必须对许多变量这样做,这是相当无聊的。有一些向量化的方法通过base R来实现,它们不需要
apply
。例如,
subset(cbind(df[1],stack(df[-1])),values==1)
或者按照您的想法,简单地说,
names(df[-1])[max.col(df[-1])]
确实更好,非常感谢:)我希望您不介意我更新了我的答案
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)
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
subset(cbind(example[1], stack(example[-1])), values == 1) 
 names(example[-1])[max.col(example[-1])]