如何均衡 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
的不同方式。另一种方法是使用您独特的 unit
和 serial
值创建两个数据集(左和右),然后通过 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.
我有一个文件,每个 "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
的不同方式。另一种方法是使用您独特的 unit
和 serial
值创建两个数据集(左和右),然后通过 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.