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"