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.

18
demandé sur coip 2014-12-07 23:40:21

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.

16
répondu eipi10 2018-05-11 22:47:55

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 |
#> +--------+------+
8
répondu avallecam 2017-04-11 04:50:03

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"
2
répondu Sam Firke 2017-03-31 03:56:41