Vars to cases & retain variable/value labels Tableau setup - 为 Tableau 重组数据,翻转数据
Vars to cases & retain variable/value labels Tableau setup - restructure data for Tableau, flip data
我正在翻转我的调查数据,以便可以在 Tableau 中使用它。这是 SPSS 中的示例数据(请记住每个变量都有值和变量标签)。
ID age rate1 rate2 rate3 mr_1 mr_2 mr_3 ...
1 35 8 3 2 1 2
2 40 2 2 3 2
3 41 6 3 5 2 3
4 43 3 3 1
其中 rate1-3 是 3 个评分问题。 Mr_1 到 mr_3 是一个多选检查所有适用的问题(你的种族是什么?1=白人 2=西班牙裔,3=黑人)
我用这个翻转数据:
VARSTOCASES
/MAKE answer FROM age rate1 rate2 rate3 mr_1 mr_2 mr_3
/INDEX=Index1(7)
/KEEP= All
/NULL=KEEP.
结果如下所示:
ID Index1 answer
1 1 35
1 2 8
1 3 3
1 4 2
1 5 1
...
...
...
将其连接到 Tableau 时效果很好。但是,我想要的不仅仅是将 Index1 作为每个已翻转变量的标识符。我想要的是这个(Var、VarLab、ValueLabel 只是 String 变量):
ID Var VarLab answer ValueLabel
1 'age' 'What is your age?' 35 '35'
1 'rate1' 'Rate food' 8 '8'
1 'rate2' 'Rate wait time' 3 '3'
1 'rate3' 'Rate bathroom' 2 '2'
1 'mr_1' 'Ethnicity' 1 'White'
1 'mr_2' 'Ethnicity' 2 'Hispanic'
...
...
...
如您所见,我为每个翻转的变量保留了变量标签、值标签和变量名称本身。这是理想的 Tableau 设置,因为 Tableau 需要 "tall" 个数据集。此外,我可以使用响应的字符串或数字表示形式。最后,我不再需要在 Tableau 中编辑别名。任何想法如何完成这个?也许这需要 python 或宏?非常感谢任何想法。
谢谢!
您需要使用 OMS 将字典读入两个数据集 - 一个用于变量标签,一个用于值标签。
然后您可以将重组后的数据集按变量名称与变量标签匹配,然后按变量名称和值将其与值标签匹配。
运行 这是为了获得两个数据集 - 当然在重组之前:
DATASET DECLARE varlab.
OMS /SELECT TABLES /IF COMMANDS=['File Information'] SUBTYPES=['Variable Information']
/DESTINATION FORMAT=SAV OUTFILE='varlab' VIEWER=YES.
DATASET DECLARE vallab.
OMS /SELECT TABLES /IF COMMANDS=['File Information'] SUBTYPES=['Variable Values']
/DESTINATION FORMAT=SAV OUTFILE='vallab' VIEWER=YES.
display dictionary.
omsend.
现在重组和匹配文件 -(在重命名适当的变量以在两个新数据集中进行匹配之后)。
这是基于使用 OMS 的其他答案的解决方案,我添加了一些其他内容。
这会翻转您想要的变量并转换您想要串接的任何其他变量。
dataset close all.
new file.
get file 'C:\Users\nicholas\Desktop\testFile.sav'.
************************************************************************************************
TABLEAU SETUP
**********************************************
insert file="C:/Users/nicholas/Desktop/Type2syntax.sps".
!toString vars = visitorType.
!flipAndMatch vars = rate1 rate2 rate3 mr_1 mr_2 mr_3.
exe.
*CATEGORIZE FLIPPED VARS
String filter (a150).
!groupingBy 'Rating satis' rate1 rate2 rate3.
!groupingBy 'MR with' mr_1 mr_2 mr_3.
save outfile 'C:\Users\nicholas\Desktop\OtherTableauTest2.sav'.
"C:/Users/nicholas/Desktop/Type2syntax.sps" 是:
* Encoding: UTF-8.
save outfile 'C:\Users\nicholas\Desktop\tempSav.sav'.
DATASET DECLARE varlab.
OMS /SELECT TABLES /IF COMMANDS=['File Information'] SUBTYPES=['Variable Information']
/DESTINATION FORMAT=SAV OUTFILE='varlab' VIEWER=YES.
DATASET DECLARE vallab.
OMS /SELECT TABLES /IF COMMANDS=['File Information'] SUBTYPES=['Variable Values']
/DESTINATION FORMAT=SAV OUTFILE='vallab' VIEWER=YES.
display dictionary.
omsend.
DATASET ACTIVATE varlab.
rename variables var1= varName / label = Question.
alter type varName (a20).
alter type Question (a1000).
sort cases by varName.
SAVE OUTFILE='C:\Users\nicholas\Desktop\varlabsTemp.sav'
/keep varName Question.
DATASET ACTIVATE vallab.
rename variables var1=varName / var2 = AnswerNumb / Label = AnswerText.
alter type varName (a20).
alter type AnswerText (a120).
sort cases by varName AnswerNumb.
SAVE OUTFILE='C:\Users\nicholas\Desktop\vallabsTemp.sav'
/keep varName AnswerNumb AnswerText.
dataset close all.
new file.
get file 'C:\Users\nicholas\Desktop\tempSav.sav'.
compute UNIQUE_ID = $casenum.
DEFINE !toString (vars=!CMDEND)
!DO !var !IN (!vars)
!LET !varDelete=!CONCAT("Delete", !var)
rename variables !var = !varDelete.
String !var (a120).
compute !var = valuelabels(!varDelete).
exe.
delete variables !varDelete.
!DOEND
!ENDDEFINE.
DEFINE !groupingBy (!POSITIONAL !TOKENS(1)
/!POSITIONAL !CMDEND)
!DO !var !IN (!2)
!LET !varString=!CONCAT("'", !var,"'")
if varName eq !varString filter eq !1.
!DOEND
exe.
!ENDDEFINE.
DEFINE !flipAndMatch (vars=!CMDEND)
VARSTOCASES
/MAKE AnswerNumb FROM !vars
/INDEX=VarName (AnswerNumb)
/KEEP=ALL
/NULL=KEEP.
EXECUTE.
sort cases by varName AnswerNumb.
alter type varName (a20).
match files files*
/table='C:\Users\nicholas\Desktop\vallabsTemp.sav'
/by varName AnswerNumb.
match files files*
/table='C:\Users\nicholas\Desktop\varlabsTemp.sav'
/by varName.
if AnswerText eq '' AnswerText = string(AnswerNumb, f).
!ENDDEFINE.
输出看起来像这样。我没有翻转年龄或访客类型,但我当然可以。
UNIQUE_ID VarName AnswerNumb AnswerText Question filter age VisitorType
1 'rate1' 8 '8' 'Rate food' 'Rating group' 35 'Overnight Visitor'
1 'rate2' 3 '3' 'Rate wait time''Rating group' 35 'Overnight Visitor'
1 'rate3' 2 '2' 'Rate bathroom' 'Rating group' 35 'Overnight Visitor'
1 'mr_1' 1 'White' 'Ethnicity' 'MR group' 35 'Overnight Visitor'
...
我正在翻转我的调查数据,以便可以在 Tableau 中使用它。这是 SPSS 中的示例数据(请记住每个变量都有值和变量标签)。
ID age rate1 rate2 rate3 mr_1 mr_2 mr_3 ...
1 35 8 3 2 1 2
2 40 2 2 3 2
3 41 6 3 5 2 3
4 43 3 3 1
其中 rate1-3 是 3 个评分问题。 Mr_1 到 mr_3 是一个多选检查所有适用的问题(你的种族是什么?1=白人 2=西班牙裔,3=黑人)
我用这个翻转数据:
VARSTOCASES
/MAKE answer FROM age rate1 rate2 rate3 mr_1 mr_2 mr_3
/INDEX=Index1(7)
/KEEP= All
/NULL=KEEP.
结果如下所示:
ID Index1 answer
1 1 35
1 2 8
1 3 3
1 4 2
1 5 1
...
...
...
将其连接到 Tableau 时效果很好。但是,我想要的不仅仅是将 Index1 作为每个已翻转变量的标识符。我想要的是这个(Var、VarLab、ValueLabel 只是 String 变量):
ID Var VarLab answer ValueLabel
1 'age' 'What is your age?' 35 '35'
1 'rate1' 'Rate food' 8 '8'
1 'rate2' 'Rate wait time' 3 '3'
1 'rate3' 'Rate bathroom' 2 '2'
1 'mr_1' 'Ethnicity' 1 'White'
1 'mr_2' 'Ethnicity' 2 'Hispanic'
...
...
...
如您所见,我为每个翻转的变量保留了变量标签、值标签和变量名称本身。这是理想的 Tableau 设置,因为 Tableau 需要 "tall" 个数据集。此外,我可以使用响应的字符串或数字表示形式。最后,我不再需要在 Tableau 中编辑别名。任何想法如何完成这个?也许这需要 python 或宏?非常感谢任何想法。
谢谢!
您需要使用 OMS 将字典读入两个数据集 - 一个用于变量标签,一个用于值标签。 然后您可以将重组后的数据集按变量名称与变量标签匹配,然后按变量名称和值将其与值标签匹配。
运行 这是为了获得两个数据集 - 当然在重组之前:
DATASET DECLARE varlab.
OMS /SELECT TABLES /IF COMMANDS=['File Information'] SUBTYPES=['Variable Information']
/DESTINATION FORMAT=SAV OUTFILE='varlab' VIEWER=YES.
DATASET DECLARE vallab.
OMS /SELECT TABLES /IF COMMANDS=['File Information'] SUBTYPES=['Variable Values']
/DESTINATION FORMAT=SAV OUTFILE='vallab' VIEWER=YES.
display dictionary.
omsend.
现在重组和匹配文件 -(在重命名适当的变量以在两个新数据集中进行匹配之后)。
这是基于使用 OMS 的其他答案的解决方案,我添加了一些其他内容。 这会翻转您想要的变量并转换您想要串接的任何其他变量。
dataset close all.
new file.
get file 'C:\Users\nicholas\Desktop\testFile.sav'.
************************************************************************************************
TABLEAU SETUP
**********************************************
insert file="C:/Users/nicholas/Desktop/Type2syntax.sps".
!toString vars = visitorType.
!flipAndMatch vars = rate1 rate2 rate3 mr_1 mr_2 mr_3.
exe.
*CATEGORIZE FLIPPED VARS
String filter (a150).
!groupingBy 'Rating satis' rate1 rate2 rate3.
!groupingBy 'MR with' mr_1 mr_2 mr_3.
save outfile 'C:\Users\nicholas\Desktop\OtherTableauTest2.sav'.
"C:/Users/nicholas/Desktop/Type2syntax.sps" 是:
* Encoding: UTF-8.
save outfile 'C:\Users\nicholas\Desktop\tempSav.sav'.
DATASET DECLARE varlab.
OMS /SELECT TABLES /IF COMMANDS=['File Information'] SUBTYPES=['Variable Information']
/DESTINATION FORMAT=SAV OUTFILE='varlab' VIEWER=YES.
DATASET DECLARE vallab.
OMS /SELECT TABLES /IF COMMANDS=['File Information'] SUBTYPES=['Variable Values']
/DESTINATION FORMAT=SAV OUTFILE='vallab' VIEWER=YES.
display dictionary.
omsend.
DATASET ACTIVATE varlab.
rename variables var1= varName / label = Question.
alter type varName (a20).
alter type Question (a1000).
sort cases by varName.
SAVE OUTFILE='C:\Users\nicholas\Desktop\varlabsTemp.sav'
/keep varName Question.
DATASET ACTIVATE vallab.
rename variables var1=varName / var2 = AnswerNumb / Label = AnswerText.
alter type varName (a20).
alter type AnswerText (a120).
sort cases by varName AnswerNumb.
SAVE OUTFILE='C:\Users\nicholas\Desktop\vallabsTemp.sav'
/keep varName AnswerNumb AnswerText.
dataset close all.
new file.
get file 'C:\Users\nicholas\Desktop\tempSav.sav'.
compute UNIQUE_ID = $casenum.
DEFINE !toString (vars=!CMDEND)
!DO !var !IN (!vars)
!LET !varDelete=!CONCAT("Delete", !var)
rename variables !var = !varDelete.
String !var (a120).
compute !var = valuelabels(!varDelete).
exe.
delete variables !varDelete.
!DOEND
!ENDDEFINE.
DEFINE !groupingBy (!POSITIONAL !TOKENS(1)
/!POSITIONAL !CMDEND)
!DO !var !IN (!2)
!LET !varString=!CONCAT("'", !var,"'")
if varName eq !varString filter eq !1.
!DOEND
exe.
!ENDDEFINE.
DEFINE !flipAndMatch (vars=!CMDEND)
VARSTOCASES
/MAKE AnswerNumb FROM !vars
/INDEX=VarName (AnswerNumb)
/KEEP=ALL
/NULL=KEEP.
EXECUTE.
sort cases by varName AnswerNumb.
alter type varName (a20).
match files files*
/table='C:\Users\nicholas\Desktop\vallabsTemp.sav'
/by varName AnswerNumb.
match files files*
/table='C:\Users\nicholas\Desktop\varlabsTemp.sav'
/by varName.
if AnswerText eq '' AnswerText = string(AnswerNumb, f).
!ENDDEFINE.
输出看起来像这样。我没有翻转年龄或访客类型,但我当然可以。
UNIQUE_ID VarName AnswerNumb AnswerText Question filter age VisitorType
1 'rate1' 8 '8' 'Rate food' 'Rating group' 35 'Overnight Visitor'
1 'rate2' 3 '3' 'Rate wait time''Rating group' 35 'Overnight Visitor'
1 'rate3' 2 '2' 'Rate bathroom' 'Rating group' 35 'Overnight Visitor'
1 'mr_1' 1 'White' 'Ethnicity' 'MR group' 35 'Overnight Visitor'
...