Cambiar la forma de trama de datos para convertir los factores en columnas en R
Pregunta
Tengo una trama de datos en 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 la que, en el marco tendría 23 columnas adicionales (en este caso), cada uno 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:
MarcoFuente:
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 ningún problema en hacer que en un bucle pero esperaba que no habría una mejor manera. Hasta ahora reshape()
no dió el resultado deseado. Ayuda sería muy apreciada.
Solución
Me gustaría tratar de obligar a 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)
A continuación, realice 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).
En caso contrario puede utilizar cast
fuera del paquete reshape
( ver esta pregunta para un ejemplo ), 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
Otros consejos
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)