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 label
Hmisc
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"