2010-08-12 37 views
5

Tôi chỉ mới bắt đầu vượt ra ngoài những điều cơ bản trong R và đã đến một điểm mà tôi cần một số trợ giúp. Tôi muốn cơ cấu lại một số dữ liệu. Đây là những gì một dataframe mẫu có thể trông giống như:Tái cơ cấu dữ liệu trong R

ID Sex Res Contact 
1 M MA ABR 
1 M MA CON 
1 M MA WWF 
2 F FL WIT 
2 F FL CON 
3 X GA XYZ 

Tôi muốn các dữ liệu để trông giống như:

ID SEX Res ABR CON WWF WIT XYZ 
1 M MA 1 1 1 0 0 
2 F FL 0 1 0 1 0 
3 X GA 0 0 0 0 1 

lựa chọn của tôi là gì? Làm thế nào tôi sẽ làm điều này trong R?

Tóm lại, tôi đang tìm cách giữ các giá trị của cột CONT và sử dụng chúng làm tên cột trong khung dữ liệu được cấu trúc lại. Tôi muốn giữ một tập các cột thay đổi liên tục (trong ví dụ thứ ở trên, tôi đã giữ ID, Sex và Res).

Ngoài ra, có thể kiểm soát các giá trị trong dữ liệu được cấu trúc lại không? Tôi có thể muốn giữ dữ liệu dưới dạng nhị phân. Tôi có thể muốn một số dữ liệu có giá trị là số lần mỗi giá trị liên hệ tồn tại cho mỗi ID.

Trả lời

12

Gói reshape là những gì bạn muốn. Tài liệu ở đây: http://had.co.nz/reshape/. Không thổi còi còi của riêng tôi, nhưng tôi cũng đã viết lên một số ghi chú trên reshape 's sử dụng ở đây: http://www.ling.upenn.edu/~joseff/rstudy/summer2010_reshape.html

Đối với mục đích của bạn, mã này nên làm việc

library(reshape) 
data$value <- 1 
cast(data, ID + Sex + Res ~ Contact, fun = "length") 
+0

Tôi đã sử dụng R trong một thời gian dài và tôi không bao giờ biết rằng bạn có thể làm dữ liệu $ value <- 1 thay vì dữ liệu $ value <- rep (1, nrow (data))). Không thể tin rằng tôi chưa bao giờ thử điều đó - điều đó có luôn hoạt động không? –

+0

@Daniel Bạn cũng nên thử 'data $ variable <- 1; data $ variable [data $ Group == "A"] <- 2' – JoFrhwld

+0

Tôi biết gói định hình lại của Hadley có lẽ là câu trả lời, nhưng tôi đã có một thời gian khó khăn để có được đầu xung quanh nó. Trong mã của bạn, giá trị $ data với phép gán là 1 làm gì? – Btibert3

2

model.matrix hoạt động tuyệt vời (điều này đã được yêu cầu gần đây, và gappy had this good answer):

> model.matrix(~ factor(d$Contact) -1) 
    factor(d$Contact)ABR factor(d$Contact)CON factor(d$Contact)WIT factor(d$Contact)WWF factor(d$Contact)XYZ 
1     1     0     0     0     0 
2     0     1     0     0     0 
3     0     0     0     1     0 
4     0     0     1     0     0 
5     0     1     0     0     0 
6     0     0     0     0     1 
attr(,"assign") 
[1] 1 1 1 1 1 
attr(,"contrasts") 
attr(,"contrasts")$`factor(d$Contact)` 
[1] "contr.treatment" 
+0

Eark! Hiểu sai câu hỏi. Bạn có thể sử dụng câu trả lời của tôi và sau đó sử dụng 'tapply', nhưng câu trả lời của JoFrhwld thì dễ hơn. – Vince

Các vấn đề liên quan