varias studio renombrar recodificar lineas hacer graficos grafico graficas etiquetas como columnas r dataframe labels assign hmisc

studio - renombrar columnas en r



R: Asignar etiquetas de variables de columnas de marcos de datos (3)

Puede asignar las etiquetas usando lapply :

var.labels = c(age="Age in Years", sex="Sex of the participant") label(data) = lapply(names(var.labels), function(x) label(data[,x]) = var.labels[x]) label(data) age sex "Age in Years" "Sex of the participant"

lapply aplica una función a cada elemento de una lista o vector. En este caso, la función se aplica a cada valor de los names(var.labels) . Leer a través de algunos tutoriales es una buena manera de obtener una idea general, pero realmente le entenderá si comienza a usar lapply en diferentes situaciones y ve cómo se comporta.

Estoy luchando con las etiquetas de variables de las columnas data.frame. Supongamos que tengo un marco de datos como este (parte de un marco de datos mucho más grande):

data <- data.frame(age = c(21, 30, 25, 41, 29, 33), sex = factor(c(1, 2, 1, 2, 1, 2), labels = c("Female", "Male")))

También tengo un vector con nombre con las etiquetas de variables para estos datos:

var.labels <- c(age = "Age in Years", sex = "Sex of the participant")

Lo que quiero hacer es asignar las etiquetas de variable en var.labels a las columnas en los datos del marco de data usando la label función del paquete Hmisc . Puedo hacerlos uno por uno como este y verificar el resultado después:

> label(data[["age"]]) <- "Age in years" > label(data[["sex"]]) <- "Sex of the participant" > label(data) age sex "Age in years" "Sex of the participant"

Las etiquetas de variable se asignan como atributos de las columnas:

> attr(data[["age"]], "label") [1] "Age in years" > attr(data[["sex"]], "label") [1] "Sex of the participant"

Maravilloso. Sin embargo, con un marco de datos más grande, digamos 100 o más columnas, esto no será muy conveniente o eficiente. Otra cosa que podría hacer fácilmente es asignarlos como atributos directamente:

> attr(data, "variable.labels") <- var.labels

No ayuda. Las etiquetas de variable no están asignadas a las columnas:

> label(data) age sex "" ""

En cambio, se asignan como un atributo del propio marco de datos (vea el último componente de la lista):

> attributes(data) $names [1] "age" "sex" $row.names [1] 1 2 3 4 5 6 $class [1] "data.frame" $variable.labels age sex "Age in Years" "Sex of the participant"

Y esto no es lo que quiero Necesito las etiquetas de variable como atributos de las columnas. Traté de escribir la siguiente función (y muchas otras):

set.var.labels <- function(dataframe, label.vector){ column.names <- names(dataframe) dataframe <- mapply(label, column.names, label.vector) return(dataframe) }

Y que ejecutarlo:

> set.var.labels(data, var.labels)

No ayudó. Devuelve los valores del vector var.labels , pero no asigna las etiquetas de variable. Si trato de asignarlo a un nuevo objeto, simplemente contiene los valores de las etiquetas de variable como un vector.


Recomiendo utilizar la función Hmisc::upData() .

Aquí un ejemplo reprex :


set.seed(22) data <- data.frame(age = floor(rnorm(6,25,10)), sex = gl(2,1,6, labels = c("f","m"))) var.labels <- c(age = "Age in Years", sex = "Sex of the participant") dplyr::as.tbl(data) # as tibble --------------------------------------------- #> # A tibble: 6 × 2 #> age sex #> <dbl> <fctr> #> 1 19 f #> 2 49 m #> 3 35 f #> 4 27 m #> 5 22 f #> 6 43 m data <- Hmisc::upData(data, labels = var.labels) # update data -------------- #> Input object size: 1328 bytes; 2 variables 6 observations #> New object size: 2096 bytes; 2 variables 6 observations Hmisc::label(data) # check new labels --------------------------------------- #> age sex #> "Age in Years" "Sex of the participant" Hmisc::contents(data) # data dictionary ------------------------------------- #> #> Data frame:data 6 observations and 2 variables Maximum # NAs:0 #> #> #> Labels Levels Class Storage #> age Age in Years integer integer #> sex Sex of the participant 2 integer #> #> +--------+------+ #> |Variable|Levels| #> +--------+------+ #> | sex | f,m | #> +--------+------+


Si su vector de etiquetas coincide con el orden de sus columnas data.frame, pero no es un vector con nombre (por lo que no se puede usar para subconjunto de columnas data.frame por nombre, como el enfoque de lapply en la otra respuesta), puede usar un bucle for:

for(i in seq_along(data)){ Hmisc::label(data[, i]) <- var.labels[i] } label(data) #> age sex #> "Age in Years" "Sex of the participant"