Cambiar la forma de trama de datos para convertir los factores en columnas en R

StackOverflow https://stackoverflow.com/questions/2404085

  •  18-09-2019
  •  | 
  •  

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:

Marco

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 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.

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top