我正在努力使用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
的值,但不指定变量标签。如果我尝试将其分配给新对象,它只包含变量标签的值作为向量。
答案 0 :(得分:20)
您可以通过从var.labels
的命名向量创建列表并将其分配给label
值来执行此操作。我已使用match
确保将var.labels
的值分配给data
中的相应列,即使var.labels
的顺序与{data
的顺序不同1}}列。
library(Hmisc)
var.labels = c(age="Age in Years", sex="Sex of the participant")
label(data) = as.list(var.labels[match(names(data), names(var.labels))])
label(data)
age sex
"Age in Years" "Sex of the participant"
原始答案
我的原始答案使用了lapply
,这实际上并不是必需的。以下是存档目的的原始答案:
您可以使用lapply
分配标签:
label(data) = lapply(names(data), function(x) var.labels[match(x, names(var.labels))])
lapply
将函数应用于列表或向量的每个元素。在这种情况下,该函数将应用于names(data)
的每个值,并从var.labels
中选择与names(data)
的当前值对应的标签值。
阅读一些教程是获得一般想法的好方法,但是如果你在不同的情况下开始使用lapply
并看看它的行为方式,你就会真正掌握它。
答案 1 :(得分:9)
我强烈建议您使用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 |
#> +--------+------+
答案 2 :(得分:2)
如果您的标签向量与data.frame列的顺序匹配,但不是命名向量(因此不能用于按名称对{。{}}方法中的data.frame列进行子集化其他答案),你可以使用for循环:
lapply
答案 3 :(得分:2)
您可以使用软件包{Hmisc}
代替{labelled}
:
data <- labelled::set_variable_labels(data, .labels = var.labels)