35

我正在努力处理 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数据框中的列。我可以像这样一一做,然后检查结果:datalabelHmisc

> 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但不分配变量标签。如果我尝试将它分配给一个新对象,它只包含变量标签的值作为向量。

4

4 回答 4

31

您可以通过从命名向量创建一个列表var.labels并将其分配给label值来做到这一点。我曾经match确保将 的值var.labels分配给它们对应的列,data即使 的顺序与列的顺序var.labels不同data

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" 

原始答案

我原来的答案 used lapply,这实际上不是必需的。这是存档目的的原始答案:

您可以使用以下方式分配标签lapply

label(data) = lapply(names(data), function(x) var.labels[match(x, names(var.labels))])

lapply将函数应用于列表或向量的每个元素。在这种情况下,该函数应用于 的每个值,names(data)并从中挑选出与var.labels的当前值相对应的标签值names(data)

阅读一些教程是了解总体思路的好方法,但如果您开始lapply在不同的情况下使用并查看它的行为方式,您将真正掌握它。

于 2014-12-07T20:53:18.197 回答
17

我强烈建议使用该Hmisc::upData()功能。

这是一个代表示例:


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 |
#> +--------+------+
于 2017-04-11T04:50:03.923 回答
7

而不是{Hmisc}你可以使用包{labelled}

data <- labelled::set_variable_labels(data, .labels = var.labels)
于 2020-07-31T03:47:49.000 回答
3

如果您的标签向量与 data.frame 列的顺序匹配,但不是命名向量(因此不能像lapply其他答案中的方法那样按名称对 data.frame 列进行子集化),您可以使用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"
于 2017-03-30T20:59:50.653 回答