R"爆炸"数据帧的列

时间:2017-10-02 21:05:22

标签: r dataframe dplyr

我有一个非常有趣的问题,我正在寻找一个智能且可能有效的解决方案。

我的数据框看起来像这样。

# A tibble: 6 x 6
  track_id   tag1   tag2  tag3   tag4   tag5
     <int>  <dbl>  <dbl> <dbl>  <dbl>  <dbl>
1  1550729  54087 109806 46869 183258  54337
2  1184201 201327   3668 46208 205245 189631
3  3763749 194264 194413  3424  91383 205245
4  2674608 198998 107401  2327   4425 107398
5  1999180  54087   4425 75574 239459   2397
6  3048820  11242 205245  2474  11056  72354

我想要的是将track_id保留在第一行但是要爆炸标签,并且在一个轨道具有特定ID的情况下,我想要设置一个真值,即一个。

为了更清楚,我们假设我从较小的一个开始:

  track_id   tag1   tag2 
1  1550729  54087 109806 
2  1184201 201327   3668 

转换后我想得到像

这样的东西
  track_id   54087   109806  201327   3668   
1  1550729       1        1       0      0
2  1184201       0        0       1      1

这是否可以快速完成,或者我应该手动推出解决方案?

3 个答案:

答案 0 :(得分:6)

来自dplyrtidyr的解决方案。

library(dplyr)
library(tidyr)

dt2 <- dt %>%
  gather(tag, value, -track_id) %>%
  select(-tag) %>%
  mutate(Occurrence = 1) %>%
  spread(value, Occurrence, fill = 0)

数据

dt <- read.table(text = "  track_id   tag1   tag2  tag3   tag4   tag5
1  1550729  54087 109806 46869 183258  54337
2  1184201 201327   3668 46208 205245 189631
3  3763749 194264 194413  3424  91383 205245
4  2674608 198998 107401  2327   4425 107398
5  1999180  54087   4425 75574 239459   2397
6  3048820  11242 205245  2474  11056  72354",
                 header = TRUE)

答案 1 :(得分:4)

使用melt()包中的dcast()data.table,这就变成了“一线”:

library(data.table)
melt(setDT(df), id.vars = "track_id")[, dcast(.SD, track_id ~ value, length)]
   track_id 2327 2397 2474 3424 3668 4425 11056 11242 46208 46869 54087 54337 72354 75574
1:  1184201    0    0    0    0    1    0     0     0     1     0     0     0     0     0
2:  1550729    0    0    0    0    0    0     0     0     0     1     1     1     0     0
3:  1999180    0    1    0    0    0    1     0     0     0     0     1     0     0     1
4:  2674608    1    0    0    0    0    1     0     0     0     0     0     0     0     0
5:  3048820    0    0    1    0    0    0     1     1     0     0     0     0     1     0
6:  3763749    0    0    0    1    0    0     0     0     0     0     0     0     0     0
   91383 107398 107401 109806 183258 189631 194264 194413 198998 201327 205245 239459
1:     0      0      0      0      0      1      0      0      0      1      1      0
2:     0      0      0      1      1      0      0      0      0      0      0      0
3:     0      0      0      0      0      0      0      0      0      0      0      1
4:     0      1      1      0      0      0      0      0      1      0      0      0
5:     0      0      0      0      0      0      0      0      0      0      1      0
6:     1      0      0      0      0      0      1      1      0      0      1      0

答案 2 :(得分:3)

可能类似以下内容。

heroku local