2017-10-02 9 views
0

私は非常に興味深い問題を抱えています。Rはデータフレームの「爆発」列

私はこのようなデータフレームを持っています。タグを爆発し、1つのトラックは、特定のIDを有する場合、私は真の値、すなわち1を入れたいが、私は希望何

# 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を維持することです。

より明確にするために、のは、私が小さいものから始めるとしましょう:

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

"ダミー変数" および/または「ワンを検索しますホットコード化 " –

+0

最初に' tag'変数を要素に変換し、次に 'model.matrix(〜。+ 0、data = your_data_frame)'を変換します。推奨されるdupes:https://stackoverflow.com/q/11952706/903061、https://stackoverflow.com/q/24142576/903061 – Gregor

答えて

6

dplyrおよびtidyrからの溶液。たぶん

library(dplyr) 
library(tidyr) 

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

DATA

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) 
3

次のようなもの。 data.tableパッケージからmelt()dcast()を使用して

dat <- read.table(text = " 
track_id tag1 tag2 
1 1550729 54087 109806 
2 1184201 201327 3668 
", header = TRUE) 
dat 

molten <- reshape2::melt(dat, id.vars = "track_id") 
xtabs(~ track_id + value, molten) 
#   value 
#track_id 3668 54087 109806 201327 
# 1184201 1  0  0  1 
# 1550729 0  1  1  0 
4

、これは "ワンライナー" 次のようになります。

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