vacio - ¿Cómo obtener esta estructura de datos en R?
recodificar variables en r (2)
Podemos usar tidyverse
library(tidyverse)
dat.m %>%
as.data.frame() %>%
rownames_to_column(''Vars'') %>%
rename(M1 = V1, M2 = V2)
# Vars M1 M2
#1 ave_max 150 61
#2 ave 60 0
#3 lepo 41 0
Si necesitamos usar data.table
library(data.table)
setnames(setDT(as.data.frame(dat.m), keep.rownames = TRUE), c(''Vars'', ''M1'', ''M2''))[]
Estoy tratando de encontrar la estructura de datos deseada a partir de la estructura de datos actual. Conozco los esquemas de la estructura de datos esperada en parte. La estructura de datos deseada incluye una list(...)
más list(...)
y una clase de factor
. Estructura de datos actual
> print(dat.m)
[,1] [,2]
ave_max 150 61
ave 60 0
lepo 41 0
dat.m <- structure(c(150L, 60L, 41L, 61L, 0L, 0L), .Dim = c(3L, 2L), .Dimnames = list(
c("ave_max", "ave", "lepo"), NULL))
Estructura de datos deseada
> print(dat.m)
Vars M1 M2
1 ave_max 150 61
2 ave 60 0
3 lepo 41 0
Sé que es esquemáticamente algo cercano a lo siguiente donde la structure(c(...)
desconocida structure(c(...)
y row.names = c(...)
structure(list(Vars = structure(c(...), .Label = c("ave_max",
"ave", "lepo"), class = "factor"), M1 = c(150, 60,
41), M2 = c(61, 0, 0)), .Names = c("Vars", "ave_max", "ave",
"lepo"), class = "data.frame", row.names = c(...))
R: 3.4.0 (backports)
Sistema operativo: Debian 8.7
Si no insiste en M1
, M2
, etc. como nombres de columna, existe una solución data.table
aún más data.table
:
library(data.table) # CRAN version 1.10.4 used
as.data.table(dat.m, keep.rownames = "Vars")
# Vars V1 V2
#1: ave_max 150 61
#2: ave 60 0
#3: lepo 41 0
Si insistes en M1
, M2
, etc. como nombres de columna y tu matriz dat.m
tiene muchas columnas, las columnas pueden renombrarse:
DT <- as.data.table(dat.m, keep.rownames = "Vars")
setnames(DT, stringr::str_replace(names(DT), "^V(?=//d+$)", "M"))
DT
# Vars M1 M2
#1: ave_max 150 61
#2: ave 60 0
#3: lepo 41 0
La expresión regular usa una aserción de preanálisis para asegurarse de que solo se cambien las columnas que comienzan con V
y las siguen y finalizan inmediatamente con al menos un dígito. Otros como Vars
, V
, V17b
, VV3
no se tocan.
Si su matriz tiene muchas columnas y el propósito de su operación no es solo tener buenos encabezados de columna para imprimir, puede considerar remodelar sus datos de forma amplia a larga. La forma larga es preferida por ggplot
por ejemplo.
DT_long <- melt(as.data.table(dat.m, keep.rownames = "Vars"), id.vars = "Vars")
DT_long
# Vars variable value
#1: ave_max V1 150
#2: ave V1 60
#3: lepo V1 41
#4: ave_max V2 61
#5: ave V2 0
#6: lepo V2 0
En forma larga, a menudo es más fácil manipular sus datos, por ejemplo, para cambiar el nombre de las columnas:
DT_long[, variable := stringr::str_replace(variable, "^V", "M")]
DT_long
# Vars variable value
#1: ave_max M1 150
#2: ave M1 60
#3: lepo M1 41
#4: ave_max M2 61
#5: ave M2 0
#6: lepo M2 0
Finalmente, puedes cambiar la forma de largo a ancho nuevamente
dcast(DT_long, Vars ~ ...)
# Vars M1 M2
#1: ave 60 0
#2: ave_max 150 61
#3: lepo 41 0
Tenga en cuenta que la fórmula de conversión reconoce dos variables especiales:. y ...
.
no representa ninguna variable; ...
representa todas las variables que no se mencionan en la formula
. (Ver ?data.table::dcast
para más detalles).