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

防止导出的字符串变量(从R到SPSS)成为因子,同时保留其他属性/值标签,r,type-conversion,label,export,spss,R,Type Conversion,Label,Export,Spss,我目前正在使用SPSS文件,并将它们导入R中进行一些清理和探索性分析。 之后,我必须将它们转换回.sav文件(SPSS文件),供我的团队其他成员使用 我使用库(SjLabeled)来保留所有值标签和变量标签,并确保通过所有操作标签都保持完整(例如,使用dplyr的left_join()而不是cbind()等函数) 现在,我的最后一集在R中准备好了,根据R,所有属性仍然正确。 函数的write_spss()生成一个spss数据集,其中包含所有数值变量的正确标签 然而,在这个过程中,它将所有字符串变

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

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

现在,我的最后一集在R中准备好了,根据R,所有属性仍然正确。 函数的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_新)
“data.frame”:10个obs。共有6个变量:
$ID:num1 2 3 4 5 6 7 8 9 10
..-attr(*,“标签”)=chr“标识符”
..-attr(*,“format.spss”)=chr“F8.2”
..-attr(*,“显示宽度”)=int 0
$FactorVariable.x:num 1 2 3 2 1
..-attr(*,“label”)=chr“这是一个标称变量”
..-attr(*,“format.spss”)=chr“F8.2”
..-attr(*,“显示宽度”)=int 0
..-attr(*,“标签”)=命名编号1 2 3
.. ..- 属性(*,“名称”)=chr“男性”未指定“女性”
$StringVariable:chr“这是一个文本”“这是更多文本”“我有800个字符的空间”“测试”。。。
..-属性(*,“标签”)=chr“定性文本”
..-attr(*,“format.spss”)=chr“A255”
..-attr(*,“显示宽度”)=int 0
$Ordinal:num 1 2 3 2 1 2 3 2
..-attr(*,“label”)=chr“序数变量”
..-attr(*,“format.spss”)=chr“F8.3”
..-attr(*,“显示宽度”)=int 0
..-attr(*,“标签”)=命名编号1 2 3
.. ..- 属性(*,“名称”)=chr“低”“中”“高”
$Interval:num 4.3 2.4 2.4 2.22 4.6 3 3.34 3.45 4.01 2.34
..-attr(*,“标签”)=chr“区间变量”
..-attr(*,“format.spss”)=chr“F8.2”
..-attr(*,“显示宽度”)=int 0
$FactorVariable.y:num 1 2 3 2 1
..-attr(*,“label”)=chr“这是一个标称变量”
..-attr(*,“format.spss”)=chr“F8.2”
..-attr(*,“显示宽度”)=int 0
..-attr(*,“标签”)=命名编号1 2 3
.. ..- attr(*,“names”)=chr“male”“female”“not specified”
此问题是因为SjLabeled将所有变量转换为数值或因子,因为这些变量可以有值标签。我现在更改了此选项并跳过了字符向量,这似乎很有效:

library(“sjlabel”)
数据“data.frame”:2个obs。第1个变量:
#>$stringVar:chr“A”和“B”
编写spss(数据,“data.sav”)
#>整理值标签。请稍候。。。
#>正在将spss文件写入“data.sav”。请稍候。。。
数据导入“data.frame”:2个obs。第1个变量:
#>$stringVar:chr“A”和“B”
#>..-attr(*,“format.spss”)=chr“A1”
由(v0.3.0)于2019-08-02创建

您需要从GitHub更新SjLabel以在您的计算机上进行检查:

假设您在R中使用的对象
SPSS_new
是一个数据帧,您能否检查应该是字符串的变量是字符串还是因子?例如,是
字符的
类(SPSS_new$ID)
,还是一个具有多个级别的因子?它确实是一个字符串变量。我还使用str(SPSS_new)添加了输出以了解更多详细信息。您是否尝试过从haven软件包中编写
write_sav
haven::write_sav(SPSS_new,“SPSS_test_new.sav”)
不幸的是,使用haven的write_sav()再次删除了数值变量的值标签(例如1=低,2=中,3=高)。变量标签至少包括在内,因此它比write.foreign()函数有部分优势。字符串变量现在是正确的。您自己有SPSS的许可证吗?通过在SPSS中使用R(即使用BEGIN程序语法),您可以避免与数据导入/导出相关的问题。