vectores vacio recodificar listas filtrar datos data crear creacion agrupar r data-structures

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