0

我有一个 SPSS 文件。我在使用'haven'包中阅读了它:

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

我创建了一个提取长标签的函数(在 SPSS -“标签”中):

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")

看起来像“避风港”中的一个小错误:

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

attr(spss1$WAVE, "label")
NULL

但是,当我将我的函数 longlabels 应用到我的数据框并要求它为每一列打印长标签时,对于同一列“WAVE”,我得到了 - 而不是 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"

此处对长标签结构的观察:那些在 SPSS 中没有长标签但确实有值(值标签)的列 - 对于它们,我的函数会抓取它们的值标签,因此现在我的长标签被记录为数字向量带有名称,例如:

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

问题:如何避免为没有长标签的列提取值标签?

4

1 回答 1

2

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

fix_labels <- function(x, TextIfMissing) {
      val <- attr(x, "label", exact = TRUE)
      if (is.null(val)) TextIfMissing else val
}
于 2015-11-13T17:56:39.250 回答