2010-03-08 9 views
12

Tengo un marco de datos donde una columna en particular tiene un conjunto de valores específicos (digamos, 1, 2, ..., 23). Lo que me gustaría hacer es convertir de este diseño a uno, donde el marco tendría 23 columnas adicionales (en este caso), cada una representando uno de los valores de los factores. Los datos de estas columnas serían booleanos que indican si una fila particular tenía un valor determinado factor ... Para mostrar un ejemplo específico: MarcoReformar el marco de datos para convertir factores en columnas en R

Fuente:

ID  DATE   SECTOR 
123  2008-01-01 1 
456  2008-01-01 3 
789  2008-01-02 5 
... <more records with SECTOR values from 1 to 5> 

formato deseado:

ID  DATE   SECTOR.1 SECTOR.2 SECTOR.3 SECTOR.4 SECTOR.5 
123  2008-01-01  T   F   F   F   F 
456  2008-01-01  F   F   T   F   F 
789  2008-01-02  F   F   F   F   T 

No tengo problemas para hacerlo en un ciclo, pero esperaba que hubiera una mejor manera. Hasta ahora reshape() no produjo el resultado deseado. La ayuda sería muy apreciada.

Respuesta

14

Intentaré enlazar otra columna llamada "valor" y estableceré value = TRUE.

df <- data.frame(cbind(1:10, 2:11, 1:3)) 
colnames(df) <- c("ID","DATE","SECTOR") 
df <- data.frame(df, value=TRUE) 

luego hacer un cambio de forma:

reshape(df, idvar=c("ID","DATE"), timevar="SECTOR", direction="wide") 

El problema de usar la función reshape es que el valor predeterminado para los valores perdidos es NA (en cuyo caso se tendrá que repetir y reemplazarlos con FALSO) .

contrario, puede utilizar cast fuera del paquete reshape (see this question for an example), y establecer el valor predeterminado para FALSE.

df.wide <- cast(df, ID + DATE ~ SECTOR, fill=FALSE) 
> df.wide 
    ID DATE  1  2  3 
1 1 2 TRUE FALSE FALSE 
2 2 3 FALSE TRUE FALSE 
3 3 4 FALSE FALSE TRUE 
4 4 5 TRUE FALSE FALSE 
5 5 6 FALSE TRUE FALSE 
6 6 7 FALSE FALSE TRUE 
7 7 8 TRUE FALSE FALSE 
8 8 9 FALSE TRUE FALSE 
9 9 10 FALSE FALSE TRUE 
10 10 11 TRUE FALSE FALSE 
+2

Gracias. Debería haber pensado en crear una columna de valor. Curiosamente, el enfoque de valor columna/remodelación toma 1.4 segundos en 9.500 filas con 26 niveles de factor, mientras que el uso de enfoque iterativo (sobre niveles) toma solo 0.6 segundos. –

+3

No se deje engañar por estas funciones: la función 'rehape' en sí misma itera si lo mira. Pero hace mucho más además de eso, lo que aumentará el tiempo total. Cosas como 'remodelar' no tienen la intención de funcionar mejor; están ahí solo para facilitar la manipulación de datos. – Shane

2

Aquí hay otro método que utiliza xtabs que puede o no puede ser más rápido (si alguien podría tratar de que me haga saber):

df <- data.frame(cbind(1:12, 2:13, 1:3)) 
colnames(df) <- c("ID","DATE","SECTOR") 
foo <- xtabs(~ paste(ID, DATE) + SECTOR, df) 
cbind(t(matrix(as.numeric(unlist(strsplit(rownames(foo), " "))), nrow=2)), foo) 
Cuestiones relacionadas