我正在处理一项大型调查。主要调查数据存储为 CSV 文件。变量和值标签文件包含在 SAS 格式和 SPSS 格式中,但存储为 TXT 文件。
我已经看到,当数据以SAS/SPSS/STATA 本机格式 (.sas/.sav/.dta)保存时,有几种方法可以轻松地将数据读入 R。到目前为止,我遇到的所有使用haven
,解决方案labelled
的foreign
解决方案都假定数据是使用相应的“其他”程序的本机格式存储的。我似乎找不到任何关于如何使用以某些标准 SAS/SPSS 格式存储的 TXT 文件为 CSV 数据添加标签的建议。
因此,假设我拥有的三个文件被命名为:
data.csv
sas_var_labels.txt
sas_val_labels.txt
data.csv
看起来像:
AB001; AB002; AC001
-9; -9; -7
-1; -9; -8
-3; -9; 100
-9; -1; 200
-4; -1; 100
sas_var_labels.txt
看起来像这样:
AB001 = "A-Section A, category B, question 1"
AB002 = "A-Section A, category B, question 2"
AC001 = "A-Section A, category C, question 1"
最后,sas_val_labels.txt
看起来像这样:
; value AB001 -9 = "-9.not applicable"
-8 = "-8.no response"
-7 = "-7.unknown"
-1 = "-1.other duration"
1 = "1.1 year"
2 = "2.1 to 3 years"
3 = "3.4 to 6 years"
4 = "4.More than 6 years"
; value AB002 -9 = "-9.not applicable"
-8 = "-8.no response"
-7 = "-7.unknown"
-1 = "-1.other type"
; value AC001 -9 = "-9.not applicable"
-8 = "-8.no response"
-7 = "-7.unknowns"
-5 = "-5.non-codable"
-1 = "-1.other category"
100 = "100.First division"
200 = "200.Second division"
到目前为止我的方法:
对于主要数据,我只是调用:
dat <- read.csv("data.csv", sep=";", stringsAsFactors=FALSE)
对于变量标签,由于标签的数量与数据中的列完全匹配,我只是以相同的方式读取 TXT 文件,然后使用包中的将第二列分配给var_label()
数据labelled
:
#first I read in the variable labels into R as a dataframe
var_labs <- read.csv("sas_var_label.txt", sep="=", stringsAsFactors=FALSE, header=FALSE, strip.white=TRUE)
#next, I assign the second column to the data as it matches exactly (for the moment)
labelled::var_label(dat) <- var_labs$V2
另一方面,对于值标签,我的方法变得更加复杂,因为标签文件没有被所有列和行组合的分隔符整齐地分隔,如您在上面提供的示例中所见。
我的第一个问题是:有没有一种简单的方法可以读取这个文件,以便保留值标签 TXT 文件的结构?
我更普遍的问题是:是否有更好的方法来处理这些标签 TXT 文件?我确定我遗漏了一些东西,所以欢迎提出任何建议。