如何使用 R 将 SPSS 变量名称和标签导出到 *.txt 文件
how to use R to export SPSS variable names and labels to *.txt file
我需要将 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 库 sjlabelled() 提取标签:
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ý"
“实验室”的class是一个列表:
> class(lab)
[1] "list"
请注意变量 Q2_1 只有标签(“dobre slozeni”等)但没有属性(1,2,3...)。
提取变量名、属性和标签的向量非常容易:
my.vars <- names(lab)
my.atts <- unlist(lapply(lab, attributes))
my.labs <- unlist(unname(lab))
...但它们的长度确实不同:
> length(my.vars)
[1] 762
> length(my.atts)
[1] 1734
> length(my.labs)
[1] 4775
我能得到的最好的是下面 - 但是不是很方便:
> 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ý
请问,在本邮件的开头,有没有将“lab”转换为上述结构的提示?
非常感谢!
兹德内克·斯卡拉
您可以编写一个小的 Vectorize
d 函数来抓取 SPSS 数据的 "label.table"
属性并对 "factor"
(即带有标签)或其他 [=29] 进行个案处理=](没有标签)。我不确定使用 sjlabelled
包的好处,所以我没有使用它。
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)
结果 只需要 rbind
ed。
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"
我需要将 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 库 sjlabelled() 提取标签:
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ý"
“实验室”的class是一个列表:
> class(lab)
[1] "list"
请注意变量 Q2_1 只有标签(“dobre slozeni”等)但没有属性(1,2,3...)。 提取变量名、属性和标签的向量非常容易:
my.vars <- names(lab)
my.atts <- unlist(lapply(lab, attributes))
my.labs <- unlist(unname(lab))
...但它们的长度确实不同:
> length(my.vars)
[1] 762
> length(my.atts)
[1] 1734
> length(my.labs)
[1] 4775
我能得到的最好的是下面 - 但是不是很方便:
> 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ý
请问,在本邮件的开头,有没有将“lab”转换为上述结构的提示? 非常感谢! 兹德内克·斯卡拉
您可以编写一个小的 Vectorize
d 函数来抓取 SPSS 数据的 "label.table"
属性并对 "factor"
(即带有标签)或其他 [=29] 进行个案处理=](没有标签)。我不确定使用 sjlabelled
包的好处,所以我没有使用它。
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)
结果 只需要 rbind
ed。
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"