R: Assignez des étiquettes variables de colonnes de base de données
je suis aux prises avec des étiquettes de données variables.cadre de colonnes. Supposons que j'ai la base de données suivante (qui fait partie d'une base de données beaucoup plus vaste):
data <- data.frame(age = c(21, 30, 25, 41, 29, 33), sex = factor(c(1, 2, 1, 2, 1, 2), labels = c("Female", "Male")))
#
j'ai aussi un nom de vecteur avec les étiquettes des variables pour ce bloc de données:
var.labels <- c(age = "Age in Years", sex = "Sex of the participant")
je veux assigner les étiquettes des variables dans var.labels pour les colonnes dans le bloc de données data utilisant la fonction labelHmisc package. Je peux les faire un par un comme cela et vérifier le résultat ensuite:
> label(data[["age"]]) <- "Age in years"
> label(data[["sex"]]) <- "Sex of the participant"
> label(data)
age sex
"Age in years" "Sex of the participant"
les étiquettes des variables sont attribuées comme attributs des colonnes:
> attr(data[["age"]], "label")
[1] "Age in years"
> attr(data[["sex"]], "label")
[1] "Sex of the participant"
Merveilleux. Cependant, avec une base de données plus grande, disons 100 colonnes ou plus, cela ne sera ni pratique ni efficace. Une autre option consiste à les attribuer directement comme attributs:
> attr(data, "variable.labels") <- var.labels
N'aide pas. Les étiquettes variables ne sont pas affectées aux colonnes:
> label(data)
age sex
"" ""
au lieu de cela, ils sont assignés comme attribut de la base de données elle-même (voir le dernier élément de la liste):
> 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"
Et ce n'est pas ce que je veux. J'ai besoin des étiquettes variables comme attributs des colonnes. J'ai essayé d'écrire la fonction suivante (et beaucoup d'autres):
set.var.labels <- function(dataframe, label.vector){
column.names <- names(dataframe)
dataframe <- mapply(label, column.names, label.vector)
return(dataframe)
}
Et ensuite l'exécuter:
> set.var.labels(data, var.labels)
N'ont pas aidé. Il renvoie les valeurs du vecteur var.labels mais n'attribue pas les étiquettes variables. Si j'essaie de l'assigner à un nouvel objet, il contient juste les valeurs des étiquettes variables comme vecteur.
3 réponses
vous pouvez le faire en créant une liste à partir du vecteur nommé de var.labels et assignez cela à la label valeurs. J'ai utilisé match pour vous assurer que les valeurs de var.labels sont assignés à leur colonne correspondante dans data même si l'ordre de var.labels est différent de l'ordre de l' data colonnes.
library(Hmisc)
var.labels = c(age="Age in Years", sex="Sex of the participant")
label(data) = as.list(var.labels[match(names(data), names(var.labels))])
label(data)
age sex
"Age in Years" "Sex of the participant"
Réponse Originale
Ma réponse originale à cette question utilisé lapply, ce qui n'est pas vraiment nécessaire. Voici la réponse originale pour des fins d'archivage:
vous pouvez assigner les étiquettes en utilisant lapply:
label(data) = lapply(names(data), function(x) var.labels[match(x, names(var.labels))])
lapply applique une fonction à chaque élément d'une liste ou un vecteur. Dans ce cas, la fonction est appliquée à chaque valeur de names(data) et il choisit la valeur de l'étiquette de var.labels qui correspond à la valeur actuelle de names(data).
lire quelques tutoriels est une bonne façon d'avoir l'idée générale, mais vous y arriverez vraiment si vous commencez à utiliser lapply dans différentes situations et voir comment il se comporte.
je vous recommande fortement d'utiliser le Hmisc::upData() fonction.
Ici reprex exemple:
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 votre vecteur d'étiquettes correspond à l'ordre de vos données.colonnes de cadre, mais n'est pas un vecteur nommé (donc ne peut pas être utilisé pour les données de sous-ensemble.encadrez les colonnes par leur nom comme le lapply approche dans l'autre réponse), vous pouvez utiliser une boucle 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"