Как добавить метки формата SAS / SPSS, хранящиеся в виде TXT-файла, в R? - PullRequest
0 голосов
/ 11 апреля 2020

У меня большой опрос, с которым я работаю. Основные данные опроса хранятся в виде файла CSV. Файлы меток переменных и значений включены как в SAS-формат, так и в SPSS-формат, но хранятся в виде TXT-файлов.

Я видел, что есть несколько способов легко прочитать данные в R, когда они сохранены в собственных форматах SAS / SPSS / STATA (.sas / .sav / .dta). До сих пор все решения, с которыми я сталкивался, используя решения haven, labelled, foreign, предполагают, что данные хранятся в собственном формате соответствующей "другой" программы. Я не могу найти какой-либо совет о том, как добавить метки к данным CSV, используя файлы TXT, хранящиеся в каком-то стандартном формате SAS / SPSS.

Итак, скажем, у меня есть три файла:

  • 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-файлов? Я уверен, что что-то упустил, поэтому любые предложения будут приветствоваться.

...