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

问题描述:

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

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

我想收视率结合起来,每一个机构,这里是这样做的这一个机构(阿德菲是唯一与188429有意义的值确定)的SPSS语法:

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. 

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

谢谢!

+0

我不知道你在做什么,但我敢肯定你做错了。 ;-)你想得到什么?你是否想通过学校获得收视率?你是否想获得一些关于受访者的数据? –

+0

所以,你基本上有两个独特的整数ID,你想要一个Python脚本,将它们组合成一个唯一的整数ID?如果是的话,这个ID需要任何属性,例如顺序,没有差距... – Denziloe

+0

我怀疑这实际上涉及到python与spss的整合,是吗?你能编辑这个问题来解释你如何存储数据吗?每个问卷是否有一个'.sav'文件,或者是什么? –

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

这会创建一组名为U188429_CoreAcad等等.U只是一个开头的前缀(“Unit 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. 
+0

太棒了!这工作,我正在寻找。唯一能让它变得更好的其他方法是将学校的实际名称作为创建变量的前缀 - 例如“Adelphi_CoreAcad”,“Adelphi_PrettyCoeds”等,而不是“U_unitid_CoreAcad” 我怀疑它会包括创建另一个列表,比如你的Unit_ids以及另一个循环... 这是很好的反馈:我们必须改变我们的调查问问学生他们真正感兴趣的东西;) 感谢您的所有帮助。 –

+0

它会。但我搜索了一系列大学,其中一些名字令人咋舌。如果您有足够的时间和精力来创建列表,您可以创建一个名为“dict”的单元格,并在脚本中添加另一个查找步骤。 –

我提出一个不同的重组方案:
首先,这两个机构分成两行,每一个与它的相应等级:

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

太棒了,该解决方案也适用。非常感谢! –