R: Назначение переменных меток столбцов фрейма данных

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

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, но не назначает метки переменных. Если я попытаюсь назначить его новому объекту, он просто содержит значения меток переменных в качестве вектора.

Ответы

Ответ 1

Вы можете назначить метки с помощью 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 в разных ситуациях и посмотрите, как она себя ведет.

Ответ 2

Я настоятельно рекомендую использовать функцию 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 |
#> +--------+------+

Ответ 3

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

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

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