如何均衡 SPSS 文件中每个单元的行数

How to equalize the number of rows per unit in an SPSS file

我有一个文件,每个 "unit" 的行数都不同,我希望所有单元都具有相同的行数,方法是在每个单元中添加正确数量的空行数据。

例如:

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(保留空值),或者准备一个包含所有行的基本文件以及单位名称和序列号,然后进行匹配它与数据文件一起,所以我最终得到了所有的行和所有的数据。
谁能建议更直接的 (\elegant\efficient\simple) 方法? 谢谢!

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 命令处理它们。

您已经提到过:创建一个包含所有行的单位名称和序列号的基础文件,然后将其与数据文件匹配是一种简单的方法。我想在这里为其他读者概述一下。

因此对于问题示例,您将创建这样的基础数据集:

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.

如果您希望代码在 "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.