我有一个非常有趣的问题,我正在寻找一个智能且可能有效的解决方案。
我的数据框看起来像这样。
# 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
这是否可以快速完成,或者我应该手动推出解决方案?
答案 0 :(得分:6)
来自dplyr
和tidyr
的解决方案。
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