mtcars - Lista nombrada a/de Data.Frame
r data frame mtcars (3)
Deseo hacer la observación, con suerte, no trivial, de la sugerencia de @Tyler Rinker
X <- split(df$x, df$name)
se puede hacer de manera más general con
X <- split(df, df$name)
La explicación de @Tyler Rinker''s split () coincide con el libro de cocina R.
especificando que un vector puede ser agrupado, mientras que de hecho todo el marco de datos puede ser agrupado. Creo que agrupar el marco de datos, no el vector, sería la herramienta más valiosa (y de hecho lo que me trajo a esta publicación).
(df <- data.frame(name=c(rep("a",3),rep("b",3), rep("c",3)), x=c(1:3,4:6, 7:9)))
(X <- split(df, df$name))
HTH.
Estoy buscando una manera rápida de ir y venir entre una lista del siguiente formato:
$`a`
[1] 1 2 3
$`b`
[1] 4 5 6
a / desde un data.frame del siguiente formato:
name x
1 a 1
2 a 2
3 a 3
4 b 4
5 b 5
6 b 6
(En realidad, no me importan los nombres de las columnas, en este caso).
Aquí está el marco de datos utilizado anteriormente en formato R:
df <- data.frame(name=c(rep("a",3),rep("b",3)), x=c(1:3,4:6))
De nuevo, estoy buscando dos operaciones separadas: una para convertir el data.frame anterior a una lista, y otra para convertirlo de nuevo a un data.frame.
Tal vez algo así como:
X <- split(df$x, df$name)
data.frame(name = rep(names(X), sapply(X, length)),
x=do.call(''c'', X))
EDITAR: decidí combinar la solución de Andrie y yo en una que parece ser exactamente lo que el OP pidió bastante simple. Dicho esto, no entiendo muy bien una situación en la que trataría los datos de esta manera en lugar de cómo lo hizo Andrie, ya que un marco de datos es una lista de vectores de igual longitud de todos modos.
# Your data set
df <- data.frame(name=c(rep("a",3),rep("b",3)), x=c(1:3,4:6))
# converting it to list of vectors
X <- split(df[, 2], df[, 1])
# converting it to a dataframe
Y <- stack(X)[, 2:1]; names(Y) <- names(df)
# Take Y and feed it back to these lines to show it
# switches back and forth
(X <- split(Y[, 2], Y[, 1]))
Y <- stack(X)[, 2:1]; names(Y) <- names(df);Y
Utilice la stack
y el unstack
en la base R:
x <- data.frame(a=1:3, b=4:6)
x
a b
1 1 4
2 2 5
3 3 6
Use la stack
de ancho a alto, es decir, apile los vectores uno encima del otro.
y <- stack(x)
y
values ind
1 1 a
2 2 a
3 3 a
4 4 b
5 5 b
6 6 b
Use unstack
para hacer lo contrario.
unstack(y)
a b
1 1 4
2 2 5
3 3 6
Si su estructura de datos es más complicada de lo que describió, stack
y unstack
ya no es adecuado. En ese caso, tendrás que usar reshape
en base R o melt
y dcast
en el paquete reshape2
.