2013-08-27 564 views
11

Ben aşağıdaki biçimi dönüştürme çalışıyorum: Ben Convert row data to binary columns ama I'de açıklanan çözüm çalıştıikili tepki değişkenlere birden kategorik değişkenler yeniden şekillendirme

 movie Leo Kate Jack 
1 Titanic 1 1 0 
2 Departed 1 0 1 

: ikili tepki değişkenlere

mydata <- data.frame(movie = c("Titanic", "Departed"), 
        actor1 = c("Leo", "Jack"), 
        actor2 = c("Kate", "Leo"))) 

    movie actor1 actor2 
1 Titanic Leo Kate 
2 Departed Jack Leo 

Üç değişken için iki değişken için çalışabilir.

Bunu yapmak için temiz bir yol varsa gerçekten çok memnun olurum.

cevap

14

Ne kadar baharat çok fazla?

library(dplyr) 
library(tidyr) 

mydata %>% 
    gather(actor,name,starts_with("actor")) %>% 
    mutate(present = 1) %>% 
    select(-actor) %>% 
    spread(name,present,fill = 0) 

     movie Jack Kate Leo 
1 Departed 1 0 1 
2 Titanic 0 1 1 
6

data.frame'unuzu yeniden şekillendirmenin bir yolu,paketiyle melt ve dcast öğelerini kullanır. Döküm sonrası iç doldurmak için biteni kontrol dcast içinde fun.aggregate ve fill parametrelere

library(reshape2) 
long.mydata <- melt(mydata, id.vars = "movie") 
wide.mydata <- dcast(long.mydata, movie ~ value, function(x) 1, fill = 0) 

miktarına dikkat: Örneğin. onlar çeşitli yaşam baharat olduğunu söylemek yana

4

, burada table kullanarak baz Ar bir yaklaşımdır:

table(cbind(mydata[1], 
      actor = unlist(mydata[-1], use.names=FALSE))) 
#   actor 
# movie  Jack Leo Kate 
# Departed 1 1 0 
# Titanic  0 1 1 

Yukarıdaki çıktı sınıfının table bir matrix olduğunu. data.frame almak için as.data.frame.matrix'u kullanın.

as.data.frame.matrix(table(
    cbind(mydata[1], actor = unlist(mydata[-1], use.names=FALSE)))) 
#   Jack Leo Kate 
# Departed 1 1 0 
# Titanic  0 1 1 
1

reshape2 -package da recast -Fonksiyon vardır: İşte tidyr üzerinden bir çözümdür.

kodu:

library(reshape2) 
recast(mydata, id.var = 'movie', movie ~ value, fun.aggregate = length) 

sonucu:

 movie Jack Kate Leo 
1 Departed 1 0 1 
2 Titanic 0 1 1 
İlgili konular