2017-02-20 27 views
3

對於每個「單位」,我有一個具有不同行數的文件,並且我希望所有單位具有相同的行數數據中每個單元的空行數是正確的。如何在SPSS文件中均衡每單位的行數

例如:

data list list/ unit serial someData. 
begin data. 
1 1 54 
2 1 57 
2 2 87 
2 3 91 
3 1 17 
3 2 43 
end data. 

什麼,我想獲得的是:

1 1 54 
1 2 . 
1 3 . 
2 1 57 
2 2 87 
2 3 91 
3 1 17 
3 2 43 
3 3 . 

我用簡單的解決方法的工作,例如casestovars =>varstocases(保持空)或者準備一個包含單元名稱和連續數的所有行的基本文件,然後將其與數據文件進行匹配,以便最終生成所有行和所有數據。
任何人都可以提出更直接的(\優雅\高效\簡單)的方法? 謝謝!

+0

沒錯這些都是方法我也會這樣做。 'LOOP'和'XSAVE'是另一種選擇,雖然不會更有效率。你可能會使用'AGGREGATE'和'VARSTOCASES'來擴展數據,但其中的任何一個都需要5到6行代碼,至少我可以想象。 –

回答

1

Cartesian product是你在這裏所要求的。

使用您的示例數據和下載Custom Extension Command,可以如下解決:

data list list/ unit serial someData. 
begin data. 
1 1 54 
2 1 57 
2 2 87 
2 3 91 
3 1 17 
3 2 43 
end data. 
DATASET NAME ds0. 
DATASET ACTIVATE ds0. 
STATS CARTPROD VAR1=unit VAR2=serial /SAVE OUTFILE="C:\Temp\dsCart". 
SORT CASES BY unit serial. 
MATCH FILES FILE=* /BY unit serial /FIRST=Primary. 
SELECT IF Primary. 
MATCH FILES FILE=* /FILE=ds0 /BY unit serial /DROP=Primary. 
EXE. 

我不知道這Custom Extension Command是多麼有效,所以你可能需要使用STATS CARTPROD的不同口味的嘗試。另一種方法是使用唯一的unitserial值創建兩個數據集(左側和右側),然後通過STATS CARTPROD命令處理這些數據集。

+0

感謝您的參考,事實上我成功地使用了這一點 - 我聚集到一個數據集,它的關鍵值(在我的真實數據中它是四個變量的組合),另一個只有序列號。然後我得到了兩個CARTPROD,它們創建了一個數據集,其中所有的鍵(「單位」)具有最大數量的行,並帶有相關的序列號。與原始文件相匹配讓我完全想到我想要的地方。 5行語法。我喜歡!! –

1

您已經提到過:創建一個包含所有單元名稱和連續字符串的基本文件,然後將其與數據文件進行匹配將是一個簡單的方法。我想在這裏爲其他讀者概述這一個。

所以對於問題例如您將創建基本數據集是這樣的:

INPUT PROGRAM. 
LOOP #i = 1 to 3. /* 3 = maximum value of unit. 
    LOOP # = 1 to 3. /* 3 = maximum value of serial. 
     COMPUTE unit = #i. 
     COMPUTE serial = #j. 
     END CASE. 
    END LOOP. 
END LOOP. 
END FILE. 
END INPUT PROGRAM. 
DATASET NAME base. 
EXECUTE. 

的數據集將是這樣的。

unit serial 
1 1 
1 2 
1 3 
2 1 
2 2 
2 3 
3 1 
3 2 
3 3 

以下匹配文件命令將帶來想要的結果。

MATCH FILES 
    /FILE base 
    /FILE data1 
    /BY unit serial. 

如果你想要的代碼是關於「單位」的最大值和「串行」,你可以使用Python擴展的更靈活:

BEGIN PROGRAM. 
import spss, spssdata 

# list of variable names 
variables = ["unit", "serial"] 

#fetch variable data 
data = spssdata.Spssdata(variables).fetchall() 

# get maximum of 'unit' and 'serial' 
maxunit = max([int(i[0]) for i in data]) 
maxserial = max([int(i[1]) for i in data]) 

# create base data set 
spss.Submit(''' 
INPUT PROGRAM. 
LOOP #i = 1 to {maxu}. 
    LOOP #j = 1 to {maxs}. 
     COMPUTE unit = #i. 
     COMPUTE serial = #j. 
     END CASE. 
    END LOOP. 
END LOOP. 
END FILE. 
END INPUT PROGRAM. 
DATASET NAME base. 
EXECUTE. 
'''.format(maxu=maxunit, maxs=maxserial)) 
END PROGRAM. 
+0

感謝您提出這一點 - 這是自動創建基本文件的絕佳解決方案。這個版本只有在關鍵變量是數字和連續時纔有效 - 對於標準基本變量,您需要循環訪問實際現有的值。但是如果說到這一點,作爲@JigneshSutar的CARTPROD建議讓我很容易就到達那裏。 –