2013-08-27 102 views
11

我想下面的格式轉換:重塑多個分類變量二元響應變量

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 

二進制響應變量:

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

我試着在 Convert row data to binary columns 但我描述的解決方案可以讓它工作兩個變量,而不是三個。

我真的很感激,如果有一個乾淨的方式來做到這一點。

回答

14

多少香料太多了?這裏是通過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

重塑您的data.frame的一種方法是使用reshape2包,使用meltdcast。例如:在dcastfun.aggregatefill參數,控制所發生鑄造後,填補了內部

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

留意。

4

因爲他們說品種是生活的調味品,這是一個使用table在基礎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 

以上輸出table類的matrix。要獲得data.frame,請使用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

reshape2 -package還具有recast -function。

的代碼:

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

其結果是:

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