2010-08-12 16 views
5

Estoy empezando a ir más allá de lo básico en R y he llegado a un punto en el que necesito ayuda. Quiero reestructurar algunos datos. Aquí es lo que una trama de datos de la muestra puede verse como:Reestructurar datos en 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 

Quiero que los datos se vean como:

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 

¿Cuáles son mis opciones? ¿Cómo haría esto en R?

En resumen, estoy buscando mantener los valores de la columna CONT y usarlos como nombres de columna en el marco de datos reestructurado. Quiero mantener constante un conjunto variable de columnas (en el ejemplo anterior, mantuve constante el ID, el sexo y la Res).

Además, ¿es posible controlar los valores en los datos reestructurados? Es posible que desee mantener los datos como binarios. Es posible que desee que algunos datos tengan el valor de la cantidad de veces que cada valor de contacto exista para cada ID.

Respuesta

12

El paquete reshape es lo que desea. Documentación aquí: http://had.co.nz/reshape/. De no sonar mi molino, pero también he escrito algunas notas sobre reshape 's usan aquí: http://www.ling.upenn.edu/~joseff/rstudy/summer2010_reshape.html

Para su propósito, este código debería funcionar

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

he estado usando R durante mucho tiempo y no sabía que se podía hacer valor $ datos <- 1 en lugar del valor de datos $ <- Rep (1, nrow (datos)). No puedo creer que nunca lo haya intentado, ¿eso siempre funcionó? –

+0

@Daniel También debería probar 'data $ variable <- 1; data $ variable [data $ Group == "A"] <- 2' – JoFrhwld

+0

Sabía que el paquete de remodelación de Hadley era probablemente la respuesta, pero me ha costado entenderlo. En tu código, ¿qué valor tiene la información $ con la asignación a 1? – Btibert3

2

model.matrix funciona muy bien (esto se le pidió recientemente, y 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

¡Oye! Entendí mal la pregunta. Puedes usar mi respuesta y luego usar 'tapply', pero la respuesta de JoFrhwld es más fácil. – Vince