r - 防止导出的字符串变量(从 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 的 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"
解决方案
这个问题是因为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
推荐阅读
- javascript - 在 HTML 文本框中只允许数字和正斜杠
- spring - 更改 Spring Reactive MongoDB 的排序规则
- c# - 如何删除选项卡标题并拉伸 TabControl 以便不显示空白?
- c# - 检测链接是否为可下载文件
- r - 如何在 Rstudio (stargazer) 中创建具有描述性统计的表?
- laravel - 如何在 Laravel Mix 中使用 purgeCss
- sql - 在 where 子句中唯一
- libreoffice - 当我选择表格 [Libreoffice] 时,无法点击 PDF 导出时的目录链接
- python - matplotlib 中的逐步线图
- docker - 什么是“清单 blob 未知:注册表未知的 blob”错误