【发布时间】:2017-02-01 22:54:35
【问题描述】:
Hadley Wickham 的 haven 包应用于 Stata 文件,返回一个包含许多“已标记”类型的列的 tibble。你可以用 str() 看到这些,例如:
$ MSACMSZ :Class 'labelled' atomic [1:8491861] NA NA NA NA NA NA NA NA NA NA ...
.. ..- attr(*, "label")= chr "metropolitan area size (cmsa/msa)"
.. ..- attr(*, "labels")= Named int [1:7] 0 1 2 3 4 5 6
.. .. ..- attr(*, "names")= chr [1:7] "not identified or nonmetropolitan" "100,000 - 249,999" "250,000 - 499,999" "500,000 - 999,999" ...
如果我可以简单地将所有这些标记的向量提取为因子会很好,但我已经将标签属性的长度与每个向量中唯一值的数量进行了比较,它有时更长,有时更短。所以我认为我需要查看所有这些并决定如何单独处理每一个。
所以我想将标签属性的值提取到一个列表中。但是,这个函数:
labels93 <- lapply(cps_00093.df, function(x){attr(X, which="labels", exact=TRUE)})
为所有变量返回 NULL。
这是 tibble 与数据框的问题吗?如何从 tibble 列中提取这些属性到列表中?
注意标签向量是命名的,我需要标签和名称。
根据@Hack-R 的请求,这里是我的数据的一个很小的 sn-p,它由 dput 转换(我以前从未使用过)。我应用了这段代码:
filter(cps_00093.df, YEAR==2015) %>%
sample_n(10) %>%
select(HHTENURE, HHINTYPE) -> tiny
dput(tiny, file = "tiny")
生成文件很小。嘿!那很简单!我以为这么小的一块很难折断。
用 Notepad++ 打开 tiny,这是我发现的:
structure(list(HHTENURE = structure(c(2L, 1L, 1L, 2L, 1L, 1L,
1L, 2L, 1L, 1L), labels = structure(c(0L, 1L, 2L, 3L, 6L, 7L), .Names = c("niu",
"owned or being bought", "rented for cash", "occupied without payment of cash rent",
"refused", "don't know")), class = "labelled"), HHINTYPE = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), labels = structure(1:3, .Names = c("interview",
"type a non-interview", "type b/c non-interview")), class = "labelled")), row.names = c(NA,
-10L), class = c("tbl_df", "tbl", "data.frame"), .Names = c("HHTENURE",
"HHINTYPE"))
我怀疑这可以通过一点间距使其更具可读性,但我不想搞砸它,因为担心会意外破坏相关信息。
【问题讨论】:
-
您能否
dput()提供封装问题的可重现示例所需的最少数据量? -
见
?haven::labelled;他们有自己的as_factor方法。 -
感谢@alistaire 的提示!不幸的是,每列的数据部分中唯一值的数量和标签向量的相对长度都在地图上。对于大多数列来说,不仅是一对一的匹配,也不仅仅是几个缺失的代码。因此,在我更仔细地查看数据并弄清楚发生了什么之前,我还没有准备好相信一种万能的转换。
-
tiny %>% mutate_all(haven::as_factor)在我看来还不错... -
@alistaire 嗯,是的。但那是因为我使用了我可以快速定位的最简单的两个变量,在我的真实数据集中的约 460 个实际变量和 850 万个观察值中。不过,你可能是对的。我希望你是;我应该很快就知道了。并感谢代码 sn-p:如果我断定它会起作用,我会使用它。
标签: r data-structures attributes stata r-haven