在R中,一些包(例如 haven
) 插入变量的label
属性(例如 haven
),它解释了变量的实质性名称。例如,gdppc
可能具有标签GDP per capita
。
这非常有用,尤其是在从 Stata 导入数据时。但是,我仍然很难知道如何在我的工作流程中使用它。
-
如何快速浏览变量和变量标签?现在我必须做
attributes(df$var)
,但这几乎不方便瞥见(names(df)
) 如何在地块中使用这些标签?同样,我可以使用
attr(df$var, "label")
来访问字符串标签。但是,这似乎很麻烦。
是否有任何官方方法可以在工作流中使用这些标签?我当然可以编写一个环绕attr
的自定义函数,但是当包以不同的方式实现label
属性时,它可能会在将来中断。因此,理想情况下,我希望haven
(或其他主要软件包)支持的官方方式。
一个来自tidyverse的咕噜声包的解决方案:
df %>% map_chr(~attributes(.)$label)
在一个简单的函数中使用 sapply 返回一个变量列表,就像在 Stata 的变量窗口中一样:
library(dplyr)
makeVlist <- function(dta) {
labels <- sapply(dta, function(x) attr(x, "label"))
tibble(name = names(labels),
label = labels)
}
这是里约热内卢解决的创新之一(完全披露:我写了这个包)。基本上,它提供了各种导入变量标签的方法,包括 haven 的做事方式和外国的方式。这里有一个简单的例子:
首先制作一个可重现的示例:
> library("rio")
> export(iris, "iris.dta")
使用 foreign::read.dta()
导入(通过 rio::import()
):
> str(import("iris.dta", haven = FALSE))
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
- attr(*, "datalabel")= chr ""
- attr(*, "time.stamp")= chr "15 Jan 2016 20:05"
- attr(*, "formats")= chr "" "" "" "" ...
- attr(*, "types")= int 255 255 255 255 253
- attr(*, "val.labels")= chr "" "" "" "" ...
- attr(*, "var.labels")= chr "" "" "" "" ...
- attr(*, "version")= int -7
- attr(*, "label.table")=List of 1
..$ Species: Named int 1 2 3
.. ..- attr(*, "names")= chr "setosa" "versicolor" "virginica"
使用haven::read_dta()
使用其本机变量属性读入,因为这些属性存储在 data.frame 级别而不是变量级别:
> str(import("iris.dta", haven = TRUE, column.labels = TRUE))
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species :Class 'labelled' atomic [1:150] 1 1 1 1 1 1 1 1 1 1 ...
.. ..- attr(*, "labels")= Named int [1:3] 1 2 3
.. .. ..- attr(*, "names")= chr [1:3] "setosa" "versicolor" "virginica"
使用haven::read_dta()
使用我们(里约开发人员)发现更方便的替代方案阅读:
> str(import("iris.dta", haven = TRUE))
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
- attr(*, "var.labels")=List of 5
..$ Sepal.Length: NULL
..$ Sepal.Width : NULL
..$ Petal.Length: NULL
..$ Petal.Width : NULL
..$ Species : NULL
- attr(*, "label.table")=List of 5
..$ Sepal.Length: NULL
..$ Sepal.Width : NULL
..$ Petal.Length: NULL
..$ Petal.Width : NULL
..$ Species : Named int 1 2 3
.. ..- attr(*, "names")= chr "setosa" "versicolor" "virginica"
通过将属性移动到 data.frame 级别,使用 attr(data, "label.var")
等更容易访问它们,而不是挖掘每个变量的属性。
注意:属性的值将为 NULL,因为我只是将本机 R 数据集写入本地文件,以便使其可重现。
带有标签包的简单解决方案(tidyverse)
descriptions <- var_label(data_raw) %>%
as_tibble() %>%
gather(key = variable, value = description)
使用 haven 包强制到一个因素
haven::as_factor(df$var, levels="label")
标记包的目的是提供方便的函数来操作使用 haven
导入的变量和值标签。
此外,questionr
包中lookfor
和describe
的函数对于显示变量和值标签也很有用。