2014-12-07 19 views
14

Mam problemy ze zmiennymi etykietami kolumn data.frame. Że mam ramkę danych, jak to (część znacznie większej ramki danych):R: Przypisywanie etykiet zmiennych kolumn kolumn danych

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

Mam też nazwie wektor ze zmienną etykiet dla tych danych:

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

Co chcę zrobić jest przypisanie zmiennych etykiet w var.labels do kolumn w ramce danych data przy użyciu funkcji label z pakietu Hmisc. Mogę zrobić je jeden po drugim tak i sprawdzić wynik potem:

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

Zmienna etykiety są przypisane jako atrybuty kolumn:

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

wspaniałe. Jednak przy większej ramce danych, powiedzmy 100 lub więcej kolumn, nie będzie to bardzo wygodne i wydajne. Inną rzeczą, którą mogę łatwo zrobić, to przypisać je bezpośrednio jako atrybuty:

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

Nie pomaga. Zmienna etykiety nie są przypisane do kolumn:

> label(data) 
age sex 
"" "" 

Zamiast tego, są one przypisane jako atrybut samej ramki danych (patrz ostatni element listy):

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

I to jest nie tego chcę. Potrzebuję etykiet zmiennych jako atrybutów kolumn. Starałem się napisać następujące funkcje (i wiele innych):

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

I niż wykonać go:

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

nie pomogło. Zwraca wartości wektora var.labels, ale nie przypisuje etykiet zmiennych. Jeśli spróbuję przypisać go do nowego obiektu, po prostu zawiera wartości zmiennych etykiet jako wektor.

Odpowiedz

15

Można przypisać etykiety używając 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 stosuje funkcję do każdego elementu listy lub wektorem. W takim przypadku funkcja zostanie zastosowana do każdej wartości names(var.labels). Zapoznanie się z kilkoma samouczkami jest dobrym sposobem na uzyskanie ogólnego pomysłu, ale na pewno się to uda, jeśli zaczniesz używać lapply w różnych sytuacjach i zobacz, jak się zachowuje.

+0

@ eipi10: Dziękuję bardzo! To działa! To jest DOKŁADNIE to, czego potrzebowałem. Mam problemy ze zrozumieniem indeksowania podczas pracy z rodziną funkcji 'apply'. Czy istnieje przewodnik, który mogę przeczytać, czy jest to kwestia doświadczenia? – panman

+0

Dla krótkich samouczków na temat 'lapply', [this] (http://rollingyours.wordpress.com/category/r-programming-apply-lapply-tapply/) i [this] (https://nsaunders.wordpress.com/2010/08/20/a-brief-introduction-to-apply-in-r /) może być pomocny. Dodałem również nieco wyjaśnienia do mojej odpowiedzi. – eipi10

2

Jeśli twój wektor etykiet jest zgodny z kolejnością kolumn data.frame, ale nie jest nazwanym wektorem (tak nie może być użyty do podzbioru kolumn data.frame według nazwy, tak jak w innej odpowiedzi znajduje się podejście lapply) można użyć pętli 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

Gorąco polecam skorzystać z funkcji Hmisc::upData().

Tutaj reprex przykład:


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 =)' jest niesamowity! Szukanie tego przez wiele godzin. –

Powiązane problemy