为两个列表中的每个唯一值创建变量
Create variable for each unique value over two lists
提前为冗长道歉post。我名义上熟悉Python,但认为它可能能够轻松完成任务。一些背景:
我有调查数据,要求受访者 select 从 1500 所左右的名单中选出他们正在考虑申请的两所学校。数据存储为两个变量(每个机构一个 selected – vname “Institution_1”、“Institution_2”),其中每个值唯一标识一个特定机构。
随后,受访者根据一系列属性对他们 select 的机构进行评分,评分范围为 1 到 6。这些评级中的每一个都作为一个单独的比例变量存储在数据中,我有两个——对应于该机构在 select 中的位置。例如,如果阿德菲大学是“Institution_1”,然后将“核心学术”的评分存储在变量“Q.32_combined_1”中;如果阿德菲大学是“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 创建这些变量 and/or 构建可行的 SPSS 语法?
谢谢!
试试这个。这很粗糙,因为我没有 SPSS,但我认为这就是你所要求的。 (注意:我不确定您要求的是正确的东西,但看看它是否有效,也许我们会从那里开始。)
这会创建一组名为 U188429_CoreAcad 的变量,等等。其中 U 只是一个前导前缀("U" 代表 "Unit ID"),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.
我建议一个不同的重组解决方案:
首先,您将这两个机构分成两行,每行都有相应的评级:
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).
提前为冗长道歉post。我名义上熟悉Python,但认为它可能能够轻松完成任务。一些背景: 我有调查数据,要求受访者 select 从 1500 所左右的名单中选出他们正在考虑申请的两所学校。数据存储为两个变量(每个机构一个 selected – vname “Institution_1”、“Institution_2”),其中每个值唯一标识一个特定机构。
随后,受访者根据一系列属性对他们 select 的机构进行评分,评分范围为 1 到 6。这些评级中的每一个都作为一个单独的比例变量存储在数据中,我有两个——对应于该机构在 select 中的位置。例如,如果阿德菲大学是“Institution_1”,然后将“核心学术”的评分存储在变量“Q.32_combined_1”中;如果阿德菲大学是“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 创建这些变量 and/or 构建可行的 SPSS 语法?
谢谢!
试试这个。这很粗糙,因为我没有 SPSS,但我认为这就是你所要求的。 (注意:我不确定您要求的是正确的东西,但看看它是否有效,也许我们会从那里开始。)
这会创建一组名为 U188429_CoreAcad 的变量,等等。其中 U 只是一个前导前缀("U" 代表 "Unit ID"),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.
我建议一个不同的重组解决方案:
首先,您将这两个机构分成两行,每行都有相应的评级:
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).