为两个列表中的每个唯一值创建变量

时间:2017-03-07 20:57:23

标签: python syntax spss

提前为这篇漫长的帖子道歉。我名义上熟悉Python,但认为它可以轻松完成任务。一些背景: 我有调查数据,被调查者被要求选择他们正在考虑申请的两所学校,在1500左右的名单中。数据存储为两个变量(每个机构选择一个--vname“Institution_1”,“Institution_2”),其中每个值唯一地标识特定机构。

后来,受访者对他们在一系列属性上以1比6的比例选择的机构进行了评分。这些评级中的每一个都作为单独的比例变量存储在数据中,我有两个 - 对应于选择机构的位置。例如,如果Adelphi大学是“Institution_1”那么“核心学者”的评级“存储在变量”Q.32_combined_1“中;如果Adelphi大学是“Institution_2”,那么“核心学者”的评级将存储在变量“Q.36_combined_1”中。

我想结合每个机构的评级,这里是这个机构的SPSS语法(Adelphi唯一标识为188429的有意义值):

DO IF (Institution_1 = 188429).
COMPUTE Adelphi_CoreAcad=Q.32_combined_1.
ELSE IF (Institution_2 = 188429).
COMPUTE Adelphi_CoreAcad =Q.36_combined_1.
END IF.
EXECUTE.

但我们的数据中有1,000多家机构。我们如何在这两个列表(Institution_1和Institution_2)上为每个唯一值创建变量。 有没有办法使用Python来创建这些变量和/或构建可行的SPSS语法?

谢谢!

2 个答案:

答案 0 :(得分:2)

试试这个。这很粗糙,因为我没有SPSS,但我认为这就是你所要求的。 (注意:我不确定你要求的是正确的东西,但看看它是否有效,也许我们会从那里开始。)

这会创建一组名为U188429_CoreAcad等的变量。其中U只是前导前缀(“单位ID”为“U”),188429是单位ID,“CoreAcad”是一个组成的字符串,你可以更改。

我使用了类别'CoreAcad','PrettyCoeds','FootballTeam'和'Drinking',因为如果我有这一切要重新做,那就是我对学校的评价。 (除了'CoreAcad',这是你的事。)

我认为您的类别在机构1中为32-35,在机构2中为36-39。您也可以更改以下类别。

我认为你可以spss.Submit一起排队。如果没有,请将字符串拆分并一次提交一行。

我注释掉了“BEGIN PROGRAM”,“import spss”,“END PROGRAM”因为我只是把东西输入命令行python2.7。取消注释以供您使用。

#BEGIN PROGRAM.
#import spss, spssaux

# According to the internet, unitids are sparse values.
Unit_ids = [
        188429, # Adelphi
        188430, # Random #s
        171204,
        100001,
]

Categories = {
    'CoreAcad' : ('Q.32_combined_1', 'Q.36_combined_1'),
    'PrettyCoeds' : ('Q.33_combined_1', 'Q.37_combined_1'),
    'FootballTeam' : ('Q.34_combined_1', 'Q.38_combined_1'),
    'Drinking' : ('Q.35_combined_1', 'Q.39_combined_1'),
}


code = """
DO IF (Institution_1 = %(unitid)d).
COMPUTE U%(unitid)d_%(category)s = %(answer1)s.
ELSE IF (Institution_2 = %(unitid)d).
COMPUTE U%(unitid)d_%(category)s = %(answer2)s.
END IF.
EXECUTE.
"""
for unitid in Unit_ids:
    for category, answers in Categories.iteritems():
        answer1,answer2 = answers
        print(code%(locals()))
        #spss.Submit(code%(locals()))


#END PROGRAM.

答案 1 :(得分:1)

我建议采用不同的重组解决方案:
首先,您将两个机构分成两行,每行都有相应的评级:

varstocases /make institution from Institution_1 Institution_2 
  /make CoreAcad from Q.32_combined_1 Q.36_combined_1
  /make otherRting from inst1var inst2var.

您可以为每个与两个机构相对应的额外评分添加另一个make子命令 此时,您的数据每个机构有一行及其评级。 您现在可以分析它们,例如:

means CoreAcad otherRting by institution.

或者您可以按机构汇总以分析其评分。例如:

DATASET DECLARE AggByInst.
AGGREGATE  /OUTFILE='AggByInst' /BREAK=institution 
    /MCoreAcad MotherRting =MEAN(CoreAcad otherRting).