¿Cómo puedo cambiar un marco de datos para que el índice de fila se use como encabezado de columna?

Tengo estos datos:

0   1.052
1   0.542
2   0.496
3   0.402
4   0.278
0   5.115
1   4.329
2   4.121
3   4.075
4   4.0088
...

Me gustaría obtenerlo para obtener una matriz con el índice como encabezado de columna y la segunda columna debajo de su índice.

r
1
user3700660 9 feb. 2015 a las 15:09

4 respuestas

La mejor respuesta

Solo necesita usar la función de matriz y cambiar el valor predeterminado de byrow:

## Create some example data
dd = data.frame(x = 0:4, y=runif(5*5))

## Specify the number of columns
## Order by Row   
matrix(dd[,2], ncol=length(unique(dd[,1])), byrow = TRUE)
2
csgillespie 9 feb. 2015 a las 12:11

Puedes usar unstack:

unstack(dat, y ~ x)

Donde dat es el nombre de su marco de datos, x es el nombre de la primera columna (indicador) y y es el nombre de la segunda columna (valor).

Un ejemplo:

set.seed(1)
dat <- data.frame(x = 0:4, y = rnorm(10))
#    x          y
# 1  0 -0.6264538
# 2  1  0.1836433
# 3  2 -0.8356286
# 4  3  1.5952808
# 5  4  0.3295078
# 6  0 -0.8204684
# 7  1  0.4874291
# 8  2  0.7383247
# 9  3  0.5757814
# 10 4 -0.3053884

unstack(dat, y ~ x)
#           X0        X1         X2        X3         X4
# 1 -0.6264538 0.1836433 -0.8356286 1.5952808  0.3295078
# 2 -0.8204684 0.4874291  0.7383247 0.5757814 -0.3053884
0
Sven Hohenstein 9 feb. 2015 a las 14:47

No estoy seguro de entender su punto, pero parece que está dispuesto a tratar una columna como encabezado o clave. En este contexto, simplemente sugeriría usar el paquete data.table y especialmente la función setkey

0
ClementWalter 9 feb. 2015 a las 12:23

Aquí hay una posible solución de data.table (no proporcionó los nombres de las columnas, así que asumí que es V1 y V2)

library(data.table)
setDT(df)[, indx := cumsum(V1 == 0)]
dcast(df, indx ~ V1, value.var = "V2")
#    indx     0     1     2     3      4
# 1:    1 1.052 0.542 0.496 0.402 0.2780
# 2:    2 5.115 4.329 4.121 4.075 4.0088

O incluso más simple (propuesto por @akrun)

library(reshape2) 
acast(df, cumsum(V1 == 0) ~ V1, value.var = 'V2')

Datos

df <- structure(list(V1 = c(0L, 1L, 2L, 3L, 4L, 0L, 1L, 2L, 3L, 4L), 
      V2 = c(1.052, 0.542, 0.496, 0.402, 0.278, 5.115, 4.329, 4.121, 
      4.075, 4.0088)), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, 
     -10L))
1
David Arenburg 9 feb. 2015 a las 12:44