R package'避风港' read_spss:如何让它忽略值标签?

时间:2015-11-12 22:57:59

标签: r attributes labels r-haven

我有一个SPSS文件。我在使用'避风港'包:

library(haven)
spss1 <- read_spss("SPSS_Example.sav")

我创建了一个提取长标签的功能(在SPSS中 - &#34;标签&#34;):

fix_labels <- function(x, TextIfMissing) {
      val <- attr(x, "label")
      if (is.null(val)) TextIfMissing else val
}
longlabels <- sapply(spss1, fix_labels, TextIfMissing = "NO LABLE IN SPSS")

看起来像是一个小小的错误&#39;

当我实际查看一个没有的变量的属性时 SPSS中的长标签,但有价值标签,我得到:

attr(spss1$WAVE, "label")
NULL

但是当我将我的函数longlabels提供给我的数据框并且问它时 打印每列的长标签,对于同一列&#34; WAVE&#34;一世 我得到 - 而不是NULL:

NULL
VERY/SOMEWHAT FAMILIAR    NOT AT ALL FAMILIAR
                     1                      2

这当然是不正确的,因为它抓住了下一个属性 (哪一个?)并用它替换NULL。

这个函数应该创建一个长标签和矢量 通常情况下,例如:

str(longlabels)
 Named chr [1:64] "Serial number" ...
 - attr(*, "names")= chr [1:64] "Respondent_Serial" "weight" "r7_1" "r7_2" ...

但是,我刚刚获得了一个包含92列的SPSS文件并且完全运行了 相同的功能。现在,我不是一个矢量,而是一个列表

str(longlabels)
List of 92
 $ VEHRATED      : chr "VEHICLE RATED"
 $ RESPID        : chr "RESPONDENT ID"
 $ RESPID8       : chr "8 DIGIT RESPONDENT NUMBER"

这里有关于longlabels结构的观察:那些列 在SPSS中没有长标签,但DO有值(值 标签) - 对于他们我的功能抓住他们的价值标签,所以现在 我的长标签被记录为带有名称的数字向量,例如:

 $ AWARE2        : Named num [1:2] 1 2
  ..- attr(*, "names")= chr [1:2] "VERY/SOMEWHAT FAMILIAR" "NOT AT ALL FAMILIAR"

问题:我怎样才能避免提取价值标签 没有长标签的列?

1 个答案:

答案 0 :(得分:1)

这是解决方案。问题是在attr()中部分匹配:

fix_labels <- function(x, TextIfMissing) {
      val <- attr(x, "label", exact = TRUE)
      if (is.null(val)) TextIfMissing else val
}