2012-05-06 22 views
7

Acabo de regresar a R después de una escritura larga pausa y estoy teniendo algunos problemas reales para recordar cómo reformar los datos. Sé que lo que quiero hacer es fácil, pero por alguna razón estoy siendo tonto esta noche y me he confundido con el derretimiento y la remodelación. Si alguien pudiera señalarme rápidamente en la dirección correcta, sería muy apreciado.simple data.frame reshape

Tengo una trama de datos como tal:

person week year 
personA 6  1 
personA 22  1 
personA 41  1 
personA 42  1 
personA 1  2 
personA 23  2 
personB 8  2 
personB 9  2 
.... 
personN x  y 

Quiero terminar con un recuento de eventos por año y por persona: (para que pueda trazar un gráfico de línea rápida para cada persona mayor años)

por ejemplo

person year1 year2 
personA 4  2 
personB 0  2 

Muchas gracias por leer.

Respuesta

8

probablemente me gustaría utilizar reshape2 paquete y la función dcast ya que maneja tanto la remodelación y la agregación en un solo paso:

library(reshape2) 
> dcast(person ~ year, value.var = "year", data = dat) 
Aggregation function missing: defaulting to length 
    person 1 2 
1 personA 4 2 
2 personB 0 2 
+0

Esto es grande - reshape hubiera usado antes, pero no reshape2 - muchas gracias. – user1378122

7

En este caso, puede simplemente usar tapply:

> with(data, tapply(week, list(person=person, year=year), length)) 
     year 
person  1 2 
    personA 4 2 
    personB NA 2 

El resultado es una matriz. Esta solución produce NA si hay celdas vacías.

+0

Me he estado preguntando si es posible incorporar 'NA's en una semana a esta solución ... Una forma sería cambiar las' NA's de la semana a algún valor extraño, pero me preguntaba si hay una salida de la solución de caja ... ¿Alguna idea? –

5

xtabs de la base R funciona muy bien para este problema:

dat <- read.table(text="person week year 
personA 6  1 
personA 22  1 
personA 41  1 
personA 42  1 
personA 1  2 
personA 23  2 
personB 8  2 
personB 9  2 
", header=TRUE) 
xtabs(~person+year, data=dat) 
#----------------- 
     year 
person 1 2 
    personA 4 2 
    personB 0 2 

Se podría pasar su salida a matplot ya que devuelve un objeto de tabla/matriz:

matplot(xtabs(~person+year, data=dat)) 

La salida eje x en este pequeño ejemplo podría no ser lo que quiere, pero con más años, podría haber un etiquetado de ejes predeterminado más satisfactorio. O bien, podría suprimir las etiquetas por defecto del eje x con xaxt = "n" y utiliza axis etiquetar como desee:

matplot( xtabs(~person+year, data=dat), xaxt="n", type="b") 
Cuestiones relacionadas