如何使用R将SPSS变量名和标签导出到*.txt文件

如何使用R将SPSS变量名和标签导出到*.txt文件,r,label,export,spss,R,Label,Export,Spss,我需要将SPSS(*.sav)文件变量名、标签和属性(非数据值)转换为R中的*.txt/*.csv。R中的首选结构(用于导出)是此表单中的data.frame,请参见以下示例: > new.label.dataframe VARIABLE.NAME ATTRIBUTE LABEL STATUS 1 Complete STATUS 2 Screen out Q1 STATUS 3

我需要将SPSS(*.sav)文件变量名、标签和属性(非数据值)转换为R中的*.txt/*.csv。R中的首选结构(用于导出)是此表单中的data.frame,请参见以下示例:

> new.label.dataframe
VARIABLE.NAME   ATTRIBUTE   LABEL
STATUS          1           Complete
STATUS          2           Screen out Q1
STATUS          3           Screen out Q5
SAMPLE          1           Kunín + Hollandia (včetně černobílých)
SAMPLE          2           Mlýn + Krajina
...etc.
Q2_1            NA          dobré složení
Q2_1            NA          Žádné konzervanty
Q2_1            NA          lahodný
...etc.
使用haven()将数据导入R后,我使用R库SjLabeled()提取标签:

library(haven)    
mydata <- read_sav("DATA_FINAL.sav", encoding = NULL, user_na = FALSE)
library(sjlabelled)
lab <- get_labels(mydata, values=T):
str(lab)

> str(lab)
List of 762

 $ ID          : NULL
 $ STATUS      : Named chr [1:3] "Complete" "Screen out Q1" "Screen out Q5"
  ..- attr(*, "names")= chr [1:3] "1" "2" "3"
 $ SAMPLE      : Named chr [1:2] "Kunín + Hollandia (včetně černobílých)" "Mlýn + Krajina"
  ..- attr(*, "names")= chr [1:2] "1" "2"
 $ ORDER       : Named chr [1:2] "Kunín ==> Hollandia || Mlýn ==> Krajina" "Hollandia ==> Kunín || Krajina ==> Mlýn"
  ..- attr(*, "names")= chr [1:2] "1" "2"
 $ Q1          : Named chr [1:6] "5x týdně nebo častěji" "1x – 4x týdně" "1x za dva týdny" "1x za měsíc" ...
  ..- attr(*, "names")= chr [1:6] "1" "2" "3" "4" ...
 $ Q2_1        : chr [1:473] "dobré složení" "Žádné konzervanty" "lahodný" "Husty" ...
 $ Q2_2        : chr [1:431] "prává chuť" "Žádné Přidatné látky" "vláčný" "Chutny" ...
 $ Q2_3        : chr [1:311] "" "Žádná Zahušťovadla" "konzistentní" "Ovocny" ...


head(lab, 6)

> head(lab, 6)
$ID
NULL

$STATUS
              1               2               3 
     "Complete" "Screen out Q1" "Screen out Q5" 

$SAMPLE
                                       1                                        2 
"Kunín + Hollandia (včetně černobílých)"                         "Mlýn + Krajina" 

$ORDER
                                        1                                         2 
"Kunín ==> Hollandia || Mlýn ==> Krajina" "Hollandia ==> Kunín || Krajina ==> Mlýn" 

$Q1
                      1                       2                       3                       4                       5                       6 
"5x týdně nebo častěji"         "1x – 4x týdně"       "1x za dva týdny"           "1x za měsíc"      "1x za čtvrt roku"            "Méně často" 

$Q2_1
  [1] "dobré složení"                                                         "Žádné konzervanty"                                                    
  [3] "lahodný"                                                               "Husty"                                                                
  [5] "Krémový"                                                               ""                                                                     
  [7] "Musi mi chutnat"                                                       "hustý"                                                                
  [9] "Chutny"                                                                "Hustý"                                                                
 [11] "vysoké procento tuku"                                                  "krémový" 
请注意,变量Q2_1只有标签(“dobre slozeni”等),但没有属性(1,2,3…)。 提取变量名、属性和标签的向量非常容易:

my.vars <- names(lab)
my.atts <- unlist(lapply(lab, attributes))
my.labs <- unlist(unname(lab))
我能得到的最好的东西如下——不过不是很方便:

> lab.u <- data.frame(unlist(lab))
> head(lab.u, 20)
                                     unlist.lab.
STATUS.1                                Complete
STATUS.2                           Screen out Q1
STATUS.3                           Screen out Q5
SAMPLE.1  Kunín + Hollandia (včetně černobílých)
SAMPLE.2                          Mlýn + Krajina
ORDER.1  Kunín ==> Hollandia || Mlýn ==> Krajina
ORDER.2  Hollandia ==> Kunín || Krajina ==> Mlýn
Q1.1                       5x týdně nebo častěji
Q1.2                               1x – 4x týdně
Q1.3                             1x za dva týdny
Q2_11                              dobré složení
Q2_12                          Žádné konzervanty
Q2_13                                    lahodný
>实验室u主管(实验室u,20)
未列出的实验室。
状态1完成
状态2筛选出Q1
状态。3筛选出Q5
样本1 Kunín+Hollandia(včetněernobílých)
样品2毫升氮+克拉伊纳
ORDER.1 Kunín==>Hollandia | Mlýn==>Krajina
订单2霍兰迪亚==>Kunín|Krajina==>Mlýn
Q1.1 5x týdněnebočastěji
Q1.2 1x–4x týdně
Q1.3 1x za dva týdny
Q2_11多布雷斯洛žení
Q2Ždékonzervanty
Q2_13拉赫顿ý
请注意,在这条消息的开头,有没有关于将“lab”转换为上述结构的提示? 非常感谢!
Zdenek Skala

您可以编写一个小型的
矢量化
d函数,用于刮取SPSS数据的
“label.table”
属性,并对
“factor”
(即有标签)或其他类(无标签)进行案例处理。我不确定使用
sjlabel
包的好处,所以我不使用它

attFun <- Vectorize(function(x) {
  if (is.factor(spss[[x]])) {
    a <- sort(attributes(spss)$label.table[[x]])
    cbind(VARIABLE.NAME=names(spss)[x], ATTRIBUTE=unname(a), LABEL=names(a))
  } else {
    u <- unique(spss[[x]])
    cbind(VARIABLE.NAME=names(spss)[x], ATTRIBUTE=NA, LABEL=u)
  }
}, SIMPLIFY=F)

示例数据:


spss您可以编写一个小型的
矢量化
d函数,用于刮取spss数据的
“label.table”
属性,并对
“factor”
(即有标签)或其他类(无标签)进行案例处理。我不确定使用
sjlabel
包的好处,所以我不使用它

attFun <- Vectorize(function(x) {
  if (is.factor(spss[[x]])) {
    a <- sort(attributes(spss)$label.table[[x]])
    cbind(VARIABLE.NAME=names(spss)[x], ATTRIBUTE=unname(a), LABEL=names(a))
  } else {
    u <- unique(spss[[x]])
    cbind(VARIABLE.NAME=names(spss)[x], ATTRIBUTE=NA, LABEL=u)
  }
}, SIMPLIFY=F)

示例数据:

spss
attFun <- Vectorize(function(x) {
  if (is.factor(spss[[x]])) {
    a <- sort(attributes(spss)$label.table[[x]])
    cbind(VARIABLE.NAME=names(spss)[x], ATTRIBUTE=unname(a), LABEL=names(a))
  } else {
    u <- unique(spss[[x]])
    cbind(VARIABLE.NAME=names(spss)[x], ATTRIBUTE=NA, LABEL=u)
  }
}, SIMPLIFY=F)
res <- do.call(rbind.data.frame, attFun(1:5))
res
#         VARIABLE.NAME ATTRIBUTE       LABEL
# 1             vehicle         1         car
# 2             vehicle         2         LGV
# 3             vehicle         3         SUV
# 4             vehicle         4         bus
# 5             vehicle         5         HGV
# 6             vehicle         6        taxi
# 7             vehicle         7         PTW
# 8              Colour         1        blue
# 9              Colour         2         red
# 10             Colour         3 silver/grey
# 11             Colour         4       white
# 12             Colour         5       black
# 13             Colour         6       green
# 14             Colour         9       other
# 15             Colour        99     unknown
# 16               hour      <NA>       57600
# 17               hour      <NA>       25200
# 18               hour      <NA>       28800
# 19               hour      <NA>       32400
# 20               hour      <NA>       50400
# 21               hour      <NA>       54000
# 22               hour      <NA>       39600
# 23               hour      <NA>       43200
# 24               hour      <NA>       61200
# 25               hour      <NA>       28800
# 26               hour      <NA>       36000
# 27               hour      <NA>       36000
# 28               hour      <NA>       39600
# 29               hour      <NA>       46800
# 30               hour      <NA>       46800
# 31            Colour2      <NA>        blue
# 32            Colour2      <NA>         red
# 33            Colour2      <NA>     unknown
# 34            Colour2      <NA>       other
# 35            Colour2      <NA> silver/grey
# 36            Colour2      <NA>       white
# 37            Colour2      <NA>       black
# 38            Colour2      <NA>       green
# 39 Distance_from_kerb      <NA>         0.5
# 40 Distance_from_kerb      <NA>           1
# 41 Distance_from_kerb      <NA>        0.25
# 42 Distance_from_kerb      <NA>        1.25
# 43 Distance_from_kerb      <NA>        0.75 
spss <- foreign::read.spss("http://staff.bath.ac.uk/pssiw/stats2/PsychBike.sav")
spss[[4]] <- as.character(spss$Colour)
names(spss)[4] <- "Colour2"