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