首页 > 解决方案 > 防止导出的字符串变量(从 R 到 SPSS)成为因子,同时保留其他属性/值标签

问题描述

我目前正在使用 SPSS 文件并将它们导入 R 以进行一些清理和探索性分析。之后我必须将它们转换回 .sav 文件(SPSS 文件)以供我团队的其他成员使用。

我使用库(sjlabelled)来保留所有值标签和变量标签,并确保通过所有操作标签保持完整(例如,使用 dplyr 的 left_join() 等函数而不是 cbind() 等)

现在我的最后一组已在 R 中准备就绪,根据 R,所有属性仍然正确。sjlabelled 的 write_spss() 函数为所有数值变量生成一个带有正确标签的 SPSS 数据集。

然而,在此过程中,它将所有字符串变量(在我的情况下为文本响应)转换为数字(因子)变量。原始文本被保留,但现在附加为描述(组成)数字因子的标签。

有什么办法可以防止这种情况发生?

我也通过 foreign() 包尝试过,但这完全跳过了所有标签。

write.foreign(SPSS_new, "SPSS_test_new.txt", "SPSS_test_new.sps",   package="SPSS")

我附上了 SPSS 中数据和变量视图的屏幕截图,用于在导入到 R 之前和导出回 SPSS 之后的虚构测试数据集。在第三张图片中,我标记了出现的问题。

原始文件的 SPSS 数据视图(R 之前) 原始文件 的 SPSS 变量视图(R 之前)我虚构的测试数据集 在此处输入图像描述

现在,在我将它从 R 导出回 SPSS 之后:

导出回 SPSS 后的 SPSS 变量视图 在此处输入图像描述

这里是我导出回 SPSS 的 data.frame 结构的 R 输出:

str(SPSS_new)
'data.frame':	10 obs. of  6 variables:
 $ ID              : num  1 2 3 4 5 6 7 8 9 10
  ..- attr(*, "label")= chr "Identifier"
  ..- attr(*, "format.spss")= chr "F8.2"
  ..- attr(*, "display_width")= int 0
 $ FactorVariable.x: num  1 2 3 2 1 2 3 2 1 1
  ..- attr(*, "label")= chr "This is a nominal variable"
  ..- attr(*, "format.spss")= chr "F8.2"
  ..- attr(*, "display_width")= int 0
  ..- attr(*, "labels")= Named num  1 2 3
  .. ..- attr(*, "names")= chr  "male" "female" "not specified"
 $ StringVariable  : chr  "This is a text" "This is more text" "I have space for 800 characters" "Test test test" ...
  ..- attr(*, "label")= chr "Qualitative text"
  ..- attr(*, "format.spss")= chr "A255"
  ..- attr(*, "display_width")= int 0
 $ Ordinal         : num  1 2 3 3 2 1 1 2 3 2
  ..- attr(*, "label")= chr "Ordinal variable"
  ..- attr(*, "format.spss")= chr "F8.3"
  ..- attr(*, "display_width")= int 0
  ..- attr(*, "labels")= Named num  1 2 3
  .. ..- attr(*, "names")= chr  "low" "medium" "high"
 $ Interval        : num  4.3 2.4 2.4 2.22 4.6 3 3.34 3.45 4.01 2.34
  ..- attr(*, "label")= chr "Interval variable"
  ..- attr(*, "format.spss")= chr "F8.2"
  ..- attr(*, "display_width")= int 0
 $ FactorVariable.y: num  1 2 3 2 1 2 3 2 1 1
  ..- attr(*, "label")= chr "This is a nominal variable"
  ..- attr(*, "format.spss")= chr "F8.2"
  ..- attr(*, "display_width")= int 0
  ..- attr(*, "labels")= Named num  1 2 3
  .. ..- attr(*, "names")= chr  "male" "female" "not specified"

标签: rtype-conversionlabelexportspss

解决方案


这个问题是因为sjlabelled将所有变量转换为数字或因子,因为它们可以具有值标签。我现在改变了这个并跳过了字符向量,这似乎有效:

library("sjlabelled")
data <- data.frame(stringVar = c("A", "B"), stringsAsFactors = FALSE)
str(data)
#> 'data.frame':    2 obs. of  1 variable:
#>  $ stringVar: chr  "A" "B"

write_spss(data, "data.sav")
#> Tidying value labels. Please wait...
#> Writing spss file to 'data.sav'. Please wait...
dataImport <- read_spss("data.sav", verbose = FALSE) 
str(dataImport)
#> 'data.frame':    2 obs. of  1 variable:
#>  $ stringVar: chr  "A" "B"
#>   ..- attr(*, "format.spss")= chr "A1"

reprex 包(v0.3.0)于 2019 年 8 月 2 日创建

您需要从 GitHub 更新sjlabelled以在您的计算机上进行检查: https ://github.com/strengejacke/sjlabelled


推荐阅读