vidrio - ¿Cómo fundir y moldear marcos de datos usando dplyr?
formas de fundir vidrio (3)
Además, el elenco puede estar usando tidyr::spread()
Ejemplo para ti
library(reshape2)
library(tidyr)
library(dplyr)
# example data : `mini_iris`
(mini_iris <- iris[c(1, 51, 101), ])
# melt
(melted1 <- mini_iris %>% melt(id.vars = "Species")) # on reshape2
(melted2 <- mini_iris %>% gather(variable, value, -Species)) # on tidyr
# cast
melted1 %>% dcast(Species ~ variable, value.var = "value") # on reshape2
melted2 %>% spread(variable, value) # on tidyr
Recientemente estoy haciendo todas mis manipulaciones de datos usando dplyr y es una excelente herramienta para eso. Sin embargo, no puedo fundir o lanzar un marco de datos usando dplyr. ¿Hay alguna forma de hacer eso? En este momento estoy usando reshape2 para este propósito.
Quiero la solución ''dplyr'' para:
require(reshape2)
data(iris)
dat <- melt(iris,id.vars="Species")
El sucesor de reshape2
es tidyr
. El equivalente de melt()
y dcast()
son gather()
y spread()
respectivamente. El equivalente a tu código sería entonces
library(tidyr)
data(iris)
dat <- gather(iris, variable, value, -Species)
Si tiene magrittr
importado, puede usar el operador de tubería como en dplyr
, es decir, escribir
dat <- iris %>% gather(variable, value, -Species)
Tenga en cuenta que debe especificar los nombres de variables y valores explícitamente, a diferencia de melt()
. Encuentro la sintaxis de gather()
bastante conveniente, porque puedes simplemente especificar las columnas que deseas convertir a formato largo, o especificar las que quieres que permanezcan en el nuevo marco de datos prefijando con ''-'' (al igual que para Species arriba), que es un poco más rápido para escribir que en melt()
. Sin embargo, he notado que al menos en mi máquina, tidyr
puede ser notablemente más lento que reshape2
.
Editar En respuesta al comentario de @hadley a continuación, estoy publicando información de tiempo comparando las dos funciones en mi PC.
library(microbenchmark)
microbenchmark(
melt = melt(iris,id.vars="Species"),
gather = gather(iris, variable, value, -Species)
)
# Unit: microseconds
# expr min lq median uq max neval
# melt 278.829 290.7420 295.797 320.5730 389.626 100
# gather 536.974 552.2515 567.395 683.2515 1488.229 100
set.seed(1)
iris1 <- iris[sample(1:nrow(iris), 1e6, replace = T), ]
system.time(melt(iris1,id.vars="Species"))
# user system elapsed
# 0.012 0.024 0.036
system.time(gather(iris1, variable, value, -Species))
# user system elapsed
# 0.364 0.024 0.387
sessionInfo()
# R version 3.1.1 (2014-07-10)
# Platform: x86_64-pc-linux-gnu (64-bit)
#
# locale:
# [1] LC_CTYPE=en_GB.UTF-8 LC_NUMERIC=C
# [3] LC_TIME=en_GB.UTF-8 LC_COLLATE=en_GB.UTF-8
# [5] LC_MONETARY=en_GB.UTF-8 LC_MESSAGES=en_GB.UTF-8
# [7] LC_PAPER=en_GB.UTF-8 LC_NAME=C
# [9] LC_ADDRESS=C LC_TELEPHONE=C
# [11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C
# attached base packages:
# [1] stats graphics grDevices utils datasets methods base
#
# other attached packages:
# [1] reshape2_1.4 microbenchmark_1.3-0 magrittr_1.0.1
# [4] tidyr_0.1
#
# loaded via a namespace (and not attached):
# [1] assertthat_0.1 dplyr_0.2 parallel_3.1.1 plyr_1.8.1 Rcpp_0.11.2
# [6] stringr_0.6.2 tools_3.1.1
Para agregar a las respuestas anteriores usando el ejemplo mini_iris de @ Lovetoken (esto es demasiado complejo para un comentario) - para aquellos recién llegados que no entienden lo que se entiende por derretimiento y fundición.
library(reshape2)
library(tidyr)
library(dplyr)
# example data : `mini_iris`
mini_iris <- iris[c(1, 51, 101), ]
# mini_iris
#Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1 5.1 3.5 1.4 0.2 setosa
#51 7.0 3.2 4.7 1.4 versicolor
#101 6.3 3.3 6.0 2.5 virginica
Melt está tomando el marco de datos y expandiéndolo en una larga lista de valores. No es eficiente, pero puede ser útil si necesita combinar conjuntos de datos. Piensa en la estructura de un cubo de hielo que se derrite sobre una mesa y se extiende.
melted1 <- testiris %>% melt(id.vars = "Species")
> nrow(melted1)
[1] 12
head(melted1)
# Species variable value
# 1 setosa Sepal.Length 5.1
# 2 versicolor Sepal.Length 7.0
# 3 virginica Sepal.Length 6.3
# 4 setosa Sepal.Width 3.5
# 5 versicolor Sepal.Width 3.2
# 6 virginica Sepal.Width 3.3
Puede ver cómo los datos se han dividido en muchas filas de valor. Los nombres de columna ahora son texto dentro de una columna variable.
el casting se reensamblará en un data.table o data.frame.