2014-12-07 6 views
14

Я борюсь с переменными метками столбцов data.frame. Скажем, у меня есть кадр данных, как это (часть гораздо большего кадр данных):R: Назначение переменных меток столбцов фрейма данных

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

У меня также есть именованный вектор с переменной этикеткой для этих данных:

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

То, что я хочу сделать заключается в назначении меток переменных в var.labels столбцам в кадре данных data с использованием функции label из пакета Hmisc. Я могу сделать их один за другим, как это и проверить результат впоследствии:

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

переменных метки присваиваются атрибуты столбцов:

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

Замечательно. Однако с более крупным фреймом данных, скажем, 100 или более столбцов, это будет не очень удобно или эффективно. Еще одна вещь, которую я мог бы легко сделать, - это присвоить их как атрибуты напрямую:

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

Не помогает. Переменные метки не отнесены к колоннам:

> label(data) 
age sex 
"" "" 

Вместо этого они назначаются в качестве атрибута самого кадра данных (см последнего компонента списка):

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

И это не то, что я хочу. Мне нужны метки переменных как атрибуты столбцов. Я попытался написать следующую функцию (и многие другие):

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

И чем выполнить его:

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

Не помогло. Он возвращает значения вектора var.labels, но не присваивает метки переменных. Если я попытаюсь назначить его новому объекту, он просто будет содержать значения меток переменных в качестве вектора.

ответ

15

можно присвоить метки с помощью 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 применяет функцию к каждому элементу списка или вектора. В этом случае функция применяется к каждому значению names(var.labels). Чтение нескольких учебных пособий - хороший способ получить общую идею, но вы действительно получите ее, если вы начнете использовать lapply в разных ситуациях и посмотрите, как он себя ведет.

+0

@ eipi10: Большое спасибо! Оно работает! Это ТОЧНО, что мне нужно. У меня проблемы с пониманием индексации при работе с семейством функций «apply». Есть ли какой-нибудь путеводитель, который я мог бы прочитать, или это вопрос опыта? – panman

+0

Для кратких руководств по 'lapply', [this] (http://rollingyours.wordpress.com/category/r-programming-apply-lapply-tapply/) и [this] (https://nsaunders.wordpress.com/2010/08/20/a-brief-introduction-to-apply-in-r /) может оказаться полезным. Я также добавил еще несколько объяснений в свой ответ. – eipi10

2

Если ваш вектор меток соответствует порядку ваших столбцов data.frame, но не является именованным вектором (поэтому не может использоваться для подмножества столбцов data.frame по имени, подобному подходу lapply в другом ответе) , вы можете использовать для цикла:

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

Я настоятельно рекомендую использовать функцию Hmisc::upData().

Вот 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 =)' is awesome! Искать это в течение нескольких часов. –

Смежные вопросы