2013-08-27 24 views
11

Sto cercando di convertire il seguente formato:Rimodellare più variabili categoriali di variabili di risposta binarie

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 

a variabili risposta binaria:

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

ho provato la soluzione descritta in Convert row data to binary columns ma io potrebbe farlo funzionare per due variabili, non tre.

Mi piacerebbe molto se c'è un modo pulito per farlo.

risposta

14

Quanta spezia è troppo? Ecco una soluzione tramite 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

Un modo per rimodellare il tuo data.frame è con il pacchetto reshape2, utilizzando melt e dcast. Per esempio:

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

Prestare attenzione alle fun.aggregate e fill parametri in dcast, che controllano ciò che va a riempire l'interno dopo il getto.

4

Da dicono varietà è il sale della vita, ecco un approccio a base di R utilizzando 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 

L'uscita di cui sopra è un matrix di classe table. Per ottenere un data.frame, utilizzare 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

Il reshape2 -package ha anche la recast -funzione.

Il codice:

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

Il risultato:

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