2013-08-27 12 views
11

Ich versuche, das folgende Format zu konvertieren:Reshape mehrere kategoriale Variablen auf binäre Antwortvariablen

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 

auf binäre Antwortvariablen: versucht

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

ich die Lösung in Convert row data to binary columns aber ich beschrieben könnte es für zwei Variablen, nicht drei funktionieren.

Ich würde wirklich schätzen, wenn es eine saubere Möglichkeit gibt, dies zu tun.

Antwort

14

Wie viel Gewürz ist zu viel? Hier ist eine Lösung über tidyr:

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

Eine Möglichkeit, Ihre data.frame umzuformen, ist mit dem reshape2 Paket, unter Verwendung melt und dcast. Zum Beispiel:

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

Achten Sie auf die fun.aggregate und fill Parameter in dcast, die kontrollieren, was nach dem Gießen im Inneren zu füllen geht.

4

Da sie Vielfalt sagen ist die Würze des Lebens, hier ist ein Ansatz in R Base table:

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

Die obige Ausgabe ein matrix der Klasse ist table. Um eine data.frame zu erhalten, verwenden Sie as.data.frame.matrix.

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

Die reshape2 -package hat auch die recast -function.

Der Code:

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

Das Ergebnis:

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