2014-12-07 5 views
14

Ich habe Probleme mit Variablenbeschriftungen von data.frame-Spalten. Sagen, dass ich einen Datenrahmen, wie dieser (Teil von viel größeren Datenrahmen) haben:R: Zuweisen von Variablenbeschriftungen von Datenrahmenspalten

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 auch einen benannten Vektor mit den Variablenlabels für diese Daten haben:

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

Was ich tun möchte, ist die Zuordnung der Variablenbezeichnungen in var.labels zu den Spalten im Datenrahmen data über die Funktion label aus dem Paket Hmisc. Ich kann durch eine wie diese ihnen eine tun und das Ergebnis überprüfen danach:

> 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 Variablenlabels als Attribute der Spalten zugeordnet sind:

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

Wunderbar. Bei einem größeren Datenrahmen von beispielsweise 100 oder mehr Spalten ist dies jedoch nicht sehr praktisch oder effizient. Eine andere Sache, die ich leicht tun könnte, ist, sie als Attribute direkt zuzuweisen:

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

Hilft nicht. Die Variablenlabels sind nicht auf die Spalten zugeordnet:

> label(data) 
age sex 
"" "" 

Stattdessen werden sie als Attribut des Datenrahmens zugeordnet selbst (die letzte Komponente der Liste sehen):

> 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 brauche die Variablenlabels 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 als es ausführen:

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

nicht helfen. Er gibt die Werte des Vektors var.labels zurück, weist jedoch keine Variablenbezeichnungen zu. Wenn ich versuche, es einem neuen Objekt zuzuweisen, enthält es nur die Werte der Variablenlabels als Vektor.

Antwort

15

können Sie die Etiketten zuweisen lapply mit:

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 wendet eine Funktion auf jedes Element einer Liste oder Vektor. In diesem Fall wird die Funktion auf jeden Wert von names(var.labels) angewendet. Das Lesen einiger Tutorials ist ein guter Weg, um die allgemeine Idee zu verstehen, aber Sie werden es wirklich verstehen, wenn Sie anfangen, lapply in verschiedenen Situationen zu verwenden und zu sehen, wie es sich verhält.

+0

@ eipi10: Vielen Dank! Es klappt! Das ist genau das, was ich brauchte. Ich habe Probleme, die Indexierung zu verstehen, wenn ich mit der Anwendungsfamilie "apply" arbeite. Gibt es einen Leitfaden, den ich lesen kann, oder ist es eine Frage der Erfahrung? – panman

+0

Für kurze Tutorials zu 'lapply', [this] (http://rollingyours.wordpress.com/category/r-programming-apply-lapply-apply/) und [this] (https://nsaunders.wordpress.com/2010/08/20/a-brief-einführung-zu-bewerben-in-r /) könnte hilfreich sein. Ich habe meiner Antwort noch weitere Erklärungen hinzugefügt. – eipi10

2

Wenn Ihr Vektor der Beschriftungen der Reihenfolge Ihrer data.frame-Spalten entspricht, aber kein benannter Vektor ist (kann also nicht verwendet werden, um data.frame-Spalten nach Namen wie die lapply-Methode in der anderen Antwort zu unterteilen) 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

ich empfehle in hohem Grade die Hmisc::upData()-Funktion 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 | 
#> +--------+------+ 
+0

'Hmisc :: upData (Daten, Labels =)' ist genial! Stundenlang danach suchen. –

Verwandte Themen