【问题标题】:Vars to cases & retain variable/value labels Tableau setup - restructure data for Tableau, flip data变量到案例并保留变量/值标签 Tableau 设置 - 为 Tableau 重构数据,翻转数据
【发布时间】:2017-04-20 15:45:38
【问题描述】:

我正在翻转我的调查数据,以便在 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 只是字符串变量):

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 需要“高”数据集。此外,我可以使用响应的字符串或数字表示。最后,我不再需要在 Tableau 中编辑别名。任何想法如何做到这一点?也许这需要python或宏?任何想法都非常感谢。

谢谢!

【问题讨论】:

  • 如果您使用 Tableau 来查看调查数据,请查看博客 datarevelations.com 以获取一些有用的提示

标签: database tableau-api spss


【解决方案1】:

您需要使用 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 似乎确实有效,它现在将值标签作为字符串变量。然而,第一个 OMS 有 3 个变量,Command_、Subtype_ 和 Label_,但数据集是空的。我没有变量标签的字符串变量。有任何想法吗?希望这是有道理的。
  • 变量标签位于带有 OMS 子类型“变量信息”而非变量标签的表中。
  • 感谢@JKP 的更正。我已经编辑了上面的代码,它现在应该适合你了 NickZiebert。
  • 谢谢,这绝对提供了解决问题所需的所有信息。我最终在 python 中使用 vdict[j].VariableLabel 并计算 !var = valuelabels(!varDelete)。在宏中获取变量/值标签。不过,这是一种更优雅的获取 var/value 标签的方式。
  • 您应该在此处发布您自己的完整解决方案作为答案,以供未来用户使用。
【解决方案2】:

这是基于使用 OMS 的其他答案的解决方案,我添加了一些其他内容。 这会翻转您想要的 var 并转换您想要字符串的任何其他 var。

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.

输出看起来像这样。我没有翻转 age 或 visitorType,但我当然可以。

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'
...

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多