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

Python 为两个列表中的每个唯一值创建变量,python,syntax,spss,Python,Syntax,Spss,提前为冗长的帖子道歉。我名义上熟悉Python,但认为它可能能够轻松完成任务。一些背景: 我有调查数据,受访者被要求从1500所左右的学校中选择他们正在考虑申请的两所学校。数据存储为两个变量(每个所选机构一个–vname“institution_1”、“institution_2”),其中每个值唯一标识一个特定机构 随后,受访者对他们选择的机构在一系列属性上进行1到6的评分。这些评级中的每一个都作为一个单独的量表变量存储在数据中,我有两个——对应于该机构所处的位置。例如,如果阿德尔菲大学是“机构

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

随后,受访者对他们选择的机构在一系列属性上进行1到6的评分。这些评级中的每一个都作为一个单独的量表变量存储在数据中,我有两个——对应于该机构所处的位置。例如,如果阿德尔菲大学是“机构1”,那么“核心学者”的评级存储在变量“Q.32_combined_1”中;如果阿德尔菲大学是“机构2”,那么“核心学者”的评级存储在变量“Q.36\U组合1”中

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

但我们的数据中有1000多个机构。我们如何为这两个列表(机构_1和机构_2)上的每个唯一值创建一个变量。 有没有一种方法可以使用Python来创建这些变量和/或构建能够工作的SPSS语法


谢谢

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

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

我使用了“CoreAcad”、“PrettyCoeds”、“FootballTeam”和“Drinking”这几个类别,因为如果我能再做一遍,我会对学校进行评级。(除了你喜欢的“科雷卡德”之外。)

我假设你的类别在机构1是32-35,机构2是36-39。您也可以更改下面的内容

我假设你可以
spss.Submit
一起提交一堆行。如果没有,则将字符串拆分,并一次提交一行

我注释掉了“开始程序”、“导入spss”、“结束程序”,因为我只是将内容输入到命令行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.

我建议另一种重组解决方案:
首先,将这两个机构分为两行,每行都有相应的评级:

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

我不知道你在做什么,但我很肯定你做错了你想得到什么?你想按学校来评分吗?你想得到一些关于受访者的数据吗?那么,你基本上有两个唯一的整数id,你想要一个Python脚本将它们组合成一个唯一的整数id?如果是这样的话,这个id是否需要任何属性,例如顺序、无间隙……我怀疑这实际上与python与spss的集成有关,是吗?你能编辑这个问题来解释你是如何存储数据的吗?每个问卷都有一个
.sav
文件吗?是的,我正在按学校进行评分。受访者选择了两所学校,它们存储在两个变量中,值是唯一的整数。每个受访者的数据存储在一个.sav文件中。我希望将这两个列表中每个唯一值的一个变量组合成一个变量——每个学校一个变量,以了解选择该学校的受访者对该学校的评价——不管它是第一还是第二。如果他们选择了Q.32_combined_1作为第一个机构,则评级存储在Q.32_combined_1中;如果他们选择Q.36_combined_1作为第二个机构,则评级存储在Q.36_1中。太棒了!这是我一直在寻找的。唯一能让它更好的方法是在创建的变量中包含学校的实际名称作为前缀,例如“Adelphi_CoreAcad”、“Adelphi_PrettyCoeds”等。我怀疑这将涉及创建另一个列表,比如你的单位ID以及另一个for循环。。。。这是一个很好的反馈:我们必须改变我们的调查,询问学生他们真正感兴趣的事情;)谢谢你的帮助,会的。但我在谷歌上搜索了一份大学名单,其中一些名字令人震惊。如果您有时间和精力创建列表,您可以创建一个{unitid:“name”,…}的
dict
,然后在脚本中添加另一个查找步骤。
DATASET DECLARE AggByInst.
AGGREGATE  /OUTFILE='AggByInst' /BREAK=institution 
    /MCoreAcad MotherRting =MEAN(CoreAcad otherRting).