2017-03-07 127 views
2

爲冗長帖子提前道歉。我名義上熟悉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'文件,或者是什麼? –

回答

2

試試這個。這很粗糙,因爲我沒有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」的單元格,並在腳本中添加另一個查找步驟。 –

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

太棒了,該解決方案也適用。非常感謝! –

相關問題