我有一个非常有趣的问题,我正在寻找一个聪明且可能有效的解决方案.
我有一个看起来像这样的数据框.
# 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
Run Code Online (Sandbox Code Playgroud)
我想要的是将track_id保留在第一行但是要爆炸标签,并且在一个轨道具有特定ID的情况下,我想要设置一个真值,即一个.
为了更清楚,让我们假设我从较小的一个开始:
track_id tag1 tag2
1 1550729 54087 109806
2 1184201 201327 3668
Run Code Online (Sandbox Code Playgroud)
转型后,我想得到类似的东西
track_id 54087 109806 201327 3668
1 1550729 1 1 0 0
2 1184201 0 0 1 1
Run Code Online (Sandbox Code Playgroud)
这件事可能很快就可以实现,或者我应该手工推出解决方案吗?
来自dplyr和的解决方案tidyr.
library(dplyr)
library(tidyr)
dt2 <- dt %>%
gather(tag, value, -track_id) %>%
select(-tag) %>%
mutate(Occurrence = 1) %>%
spread(value, Occurrence, fill = 0)
Run Code Online (Sandbox Code Playgroud)
数据
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)
Run Code Online (Sandbox Code Playgroud)