2013-08-27 40 views
11

Tôi cố gắng để chuyển đổi các định dạng sau:Hình dạng nhiều biến phân loại để biến phản ứng nhị phân

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 

để biến phản ứng nhị phân:

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

Tôi đã thử các giải pháp được mô tả trong Convert row data to binary columns nhưng tôi có thể làm cho nó hoạt động cho hai biến, không phải ba.

Tôi thực sự đánh giá cao nếu có cách làm sạch.

Trả lời

14

Có bao nhiêu gia vị quá nhiều? Dưới đây là một giải pháp thông qua 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

Một cách để định hình lại data.frame của bạn là gói reshape2, sử dụng meltdcast. Ví dụ:

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

Chú ý đến các thông số fun.aggregatefill trong dcast, mà kiểm soát những gì diễn ra để điền vào các nội thất sau khi đúc.

4

Vì họ nói nhiều là gia vị của cuộc sống, đây là một cách tiếp cận trong cơ sở R sử dụng 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 

Kết quả trên là một matrix của lớp table. Để có được một số data.frame, hãy sử dụng 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

Các reshape2 -package cũng có recast -function.

Mã:

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

Kết quả:

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