2014-12-07 16 views
14

Sono alle prese con le etichette delle variabili delle colonne data.frame. Dire che ho un frame di dati come questo (parte di molto più grande cornice di dati):R: Assegna etichette variabili delle colonne del frame di dati

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

Ho anche un vettore di nome con le etichette di variabile di questi dati:

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

Quello che voglio fare è assegnare le etichette variabili in var.labels alle colonne nel riquadro dati data utilizzando la funzione label dal pacchetto Hmisc. Posso fare uno per uno come questo e controllare il risultato in seguito:

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

Le etichette delle variabili sono assegnati come attributi delle colonne:

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

meraviglioso. Tuttavia, con un frame di dati più grande, ad esempio 100 o più colonne, questo non sarà molto comodo o efficiente. Un'altra cosa che potrei facilmente fare è assegnarli direttamente come attributi:

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

Non aiuta. Le etichette delle variabili non sono assegnati alle colonne:

> label(data) 
age sex 
"" "" 

Invece, sono assegnati come un attributo del telaio dati stessi (vedi l'ultimo componente della lista):

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

E questo è non quello che voglio Ho bisogno delle etichette delle variabili come attributi delle colonne. Ho provato a scrivere la seguente funzione (e molti altri):

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

e poi eseguirlo:

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

non ha aiutato. Restituisce i valori del vettore var.labels, ma non assegna le etichette delle variabili. Se provo ad assegnarlo a un nuovo oggetto, esso contiene solo i valori delle etichette delle variabili come un vettore.

risposta

15

È possibile assegnare le etichette utilizzando lapply:

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 applica una funzione di ogni elemento di una lista o di un vettore. In questo caso, la funzione viene applicata a ciascun valore di names(var.labels). La lettura di alcuni tutorial è un buon modo per ottenere l'idea generale, ma se ne impari a utilizzare lo lapply in diverse situazioni e a vedere come si comporta.

+0

@ eipi10: Thank you very much! Funziona! Questo è ESATTAMENTE ciò di cui avevo bisogno. Ho problemi a capire l'indicizzazione quando utilizzo la famiglia di funzioni 'apply'. C'è qualche guida che potrei leggere o è una questione di esperienza? – panman

+0

Per brevi tutorial su 'lapply', [this] (http://rollingyours.wordpress.com/category/r-programming-apply-lapply-tapply/) e [this] (https://nsaunders.wordpress.com)/2010/08/20/a-brief-introduction-to-apply-in-r /) potrebbe essere utile. Ho anche aggiunto qualche altra spiegazione alla mia risposta. – eipi10

2

Se il vettore di etichette corrisponde all'ordine delle colonne data.frame, ma non è un vettore con nome (quindi non può essere utilizzato per sottoporre a set secondario data.frame colonne per nome come l'approccio lapply nell'altra risposta) , è possibile utilizzare un ciclo 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" 
3

Consiglio vivamente di utilizzare la funzione Hmisc::upData().

Ecco un esempio reprex:


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 (data, labels =)' è fantastico! Cercando questo per ore. –

Problemi correlati