it-swarm.com.de

R: Variable Beschriftungen von Datenrahmenspalten zuweisen

Ich habe mit variablen Bezeichnungen von data.frame-Spalten zu kämpfen. Angenommen, ich habe den folgenden Datenrahmen (Teil eines viel größeren Datenrahmens):

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

Ich habe auch einen benannten Vektor mit den Variablenbezeichnungen für diesen Datenrahmen:

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

Ich möchte die Variablenbeschriftungen in var.labels Mit der Funktion data aus dem Paket label den Spalten im Datenrahmen Hmisc zuweisen. Ich kann sie eins nach dem anderen so machen und das Ergebnis danach überprüfen:

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

Die Variablenbeschriftungen werden als Attribute der Spalten zugewiesen:

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

Wunderbar Bei einem größeren Datenrahmen, beispielsweise 100 oder mehr Spalten, ist dies jedoch nicht praktisch oder effizient. Eine andere Möglichkeit besteht darin, sie direkt als Attribute zuzuweisen:

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

Hilft nicht. Die Variablenbezeichnungen sind nicht den Spalten zugeordnet:

> label(data)
age sex
 ""  ""

Stattdessen werden sie als Attribut des Datenrahmens selbst zugewiesen (siehe letzte Komponente der 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"

Und das ist nicht was ich will. Ich benötige die Variablenbezeichnungen als Attribute der Spalten. Ich habe versucht, die folgende Funktion (und viele andere) zu schreiben:

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

Und dann führe es aus:

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

Hat nicht geholfen. Es gibt die Werte des Vektors var.labels Zurück, weist aber die Variablenbeschriftungen nicht zu. Wenn ich versuche, es einem neuen Objekt zuzuweisen, enthält es nur die Werte der Variablenbeschriftungen als Vektor.

20
panman

Sie können dies tun, indem Sie eine Liste aus dem benannten Vektor von var.labels Erstellen und diese den label -Werten zuweisen. Ich habe match verwendet, um sicherzustellen, dass die Werte von var.labels Der entsprechenden Spalte in data zugewiesen werden, auch wenn sich die Reihenfolge von var.labels Von der Reihenfolge unterscheidet der data Spalten.

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" 

rsprüngliche Antwort

Meine ursprüngliche Antwort verwendete lapply, was eigentlich nicht notwendig ist. Hier ist die ursprüngliche Antwort für Archivierungszwecke:

Sie können die Bezeichnungen mit lapply zuweisen:

label(data) = lapply(names(data), function(x) var.labels[match(x, names(var.labels))])

lapply wendet eine Funktion auf jedes Element einer Liste oder eines Vektors an. In diesem Fall wird die Funktion auf jeden Wert von names(data) angewendet und es wird der Bezeichnungswert aus var.labels Ausgewählt, der dem aktuellen Wert von names(data) entspricht.

Ein paar Tutorials durchzulesen ist eine gute Methode, um sich einen Überblick zu verschaffen. Sie werden es jedoch verstehen, wenn Sie anfangen, lapply in verschiedenen Situationen zu verwenden und sehen, wie es sich verhält.

20
eipi10

Ich empfehle dringend, die Funktion Hmisc::upData() zu verwenden.

Hier ein reprex Beispiel:


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 |
#> +--------+------+
9
avallecam

Wenn Ihr Label-Vektor mit der Reihenfolge Ihrer data.frame-Spalten übereinstimmt, aber kein benannter Vektor ist (daher kann er nicht verwendet werden, um data.frame-Spalten nach Namen zu unterteilen, wie in der anderen Antwort mit dem Ansatz lapply ) können Sie eine for-Schleife verwenden:

for(i in seq_along(data)){
  Hmisc::label(data[, i]) <- var.labels[i]
}

label(data)
#>                      age                      sex 
#>           "Age in Years" "Sex of the participant"
3
Sam Firke