如何在 SPSS 中执行多对多或(至少)外部联接
How to perform a many-to-many or (at least) a outer-join in SPSS
通常我使用[R] 进行数据分析,但最近我不得不使用SPSS。我原以为数据操作可能会以这种方式变得更加困难,但在我的第一天之后我有点投降 :D 我真的很感激一些帮助......
我的问题如下:
- 我有两个数据集,它们都有一个ID号。两个数据集都没有唯一ID(在一个应该有唯一ID的数据集中,有一种重复的行)
- 在一个完美的世界中,我想保留这个重复的行并简单地执行多对多连接。但我接受了,我可能必须删除这个“坏”行(在数据集 A 中)并执行 1:many-join(将数据集 B 连接到包含唯一 ID 的数据集 A)。
- 如果我 运行 连接(并接受似乎不可能 运行 一个 1:many,但只能一个 many:1-连接),我有问题,我丢失了 ID。如果我将数据集 A 连接到数据集 B,我将丢失所有不属于数据集 B 的案例。但我真的很想拥有两个 ID,例如完全连接或其他东西。
你知道我的问题是否有(某种)简单的解决方案吗?
示例:
数据集 A:
ID
VAL1
1
A
1
B
2
D
3
K
4
A
数据集 B:
ID
VAL2
1
g
2
k
4
a
5
c
5
d
5
a
2
x
预期结果(最佳解决方案):
ID
VAL1
VAL2
1
A
g
1
B
g
2
D
k
3
K
NA
4
A
a
2
D
x
预期结果(次佳解决方案):
ID
VAL1
VAL2
1
A
g
2
D
k
3
K
NA
4
A
a
5
NA
c
5
NA
d
5
NA
a
2
D
x
我得到的结果(最差的解决方案):
ID
VAL1
VAL2
1
A
g
2
D
k
4
A
a
5
NA
c
5
NA
d
5
NA
a
2
D
x
从你的例子看来,你需要的是一个完整的多对多连接,基于数据集 A 中存在的 ID。你可以通过使用数据集 A 创建两个数据集的完整笛卡尔积来获得它作为 first\left 数据集。
以下语法假定您安装了 STATS CARTPROD 扩展命令。如果你不这样做,你可以看到 here 关于安装它。
首先,我将重新创建您的示例以进行演示:
dataset close all.
data list list/id1 vl1 (2F3) .
begin data
1 232
1 433
2 456
3 246
4 468
end data.
dataset name aaa.
data list list/id2 vl2 (2F3) .
begin data
1 111
2 222
4 333
5 444
5 555
5 666
2 777
3 888
end data.
dataset name bbb.
现在实际工作相当简单了:
DATASET ACTIVATE aaa.
STATS CARTPROD VAR1=id1 vl1 INPUT2=bbb VAR2=id2 vl2
/SAVE OUTFILE="C:\somepath\yourcartesianproduct.sav".
* The new dataset now contains all possible combinations of rows in the two datasets.
* we will select only the relevant combinations, where the two ID's match.
select if id1=id2.
exe.
通常我使用[R] 进行数据分析,但最近我不得不使用SPSS。我原以为数据操作可能会以这种方式变得更加困难,但在我的第一天之后我有点投降 :D 我真的很感激一些帮助...... 我的问题如下:
- 我有两个数据集,它们都有一个ID号。两个数据集都没有唯一ID(在一个应该有唯一ID的数据集中,有一种重复的行)
- 在一个完美的世界中,我想保留这个重复的行并简单地执行多对多连接。但我接受了,我可能必须删除这个“坏”行(在数据集 A 中)并执行 1:many-join(将数据集 B 连接到包含唯一 ID 的数据集 A)。
- 如果我 运行 连接(并接受似乎不可能 运行 一个 1:many,但只能一个 many:1-连接),我有问题,我丢失了 ID。如果我将数据集 A 连接到数据集 B,我将丢失所有不属于数据集 B 的案例。但我真的很想拥有两个 ID,例如完全连接或其他东西。
你知道我的问题是否有(某种)简单的解决方案吗?
示例:
数据集 A:
ID | VAL1 |
---|---|
1 | A |
1 | B |
2 | D |
3 | K |
4 | A |
数据集 B:
ID | VAL2 |
---|---|
1 | g |
2 | k |
4 | a |
5 | c |
5 | d |
5 | a |
2 | x |
预期结果(最佳解决方案):
ID | VAL1 | VAL2 |
---|---|---|
1 | A | g |
1 | B | g |
2 | D | k |
3 | K | NA |
4 | A | a |
2 | D | x |
预期结果(次佳解决方案):
ID | VAL1 | VAL2 |
---|---|---|
1 | A | g |
2 | D | k |
3 | K | NA |
4 | A | a |
5 | NA | c |
5 | NA | d |
5 | NA | a |
2 | D | x |
我得到的结果(最差的解决方案):
ID | VAL1 | VAL2 |
---|---|---|
1 | A | g |
2 | D | k |
4 | A | a |
5 | NA | c |
5 | NA | d |
5 | NA | a |
2 | D | x |
从你的例子看来,你需要的是一个完整的多对多连接,基于数据集 A 中存在的 ID。你可以通过使用数据集 A 创建两个数据集的完整笛卡尔积来获得它作为 first\left 数据集。
以下语法假定您安装了 STATS CARTPROD 扩展命令。如果你不这样做,你可以看到 here 关于安装它。
首先,我将重新创建您的示例以进行演示:
dataset close all.
data list list/id1 vl1 (2F3) .
begin data
1 232
1 433
2 456
3 246
4 468
end data.
dataset name aaa.
data list list/id2 vl2 (2F3) .
begin data
1 111
2 222
4 333
5 444
5 555
5 666
2 777
3 888
end data.
dataset name bbb.
现在实际工作相当简单了:
DATASET ACTIVATE aaa.
STATS CARTPROD VAR1=id1 vl1 INPUT2=bbb VAR2=id2 vl2
/SAVE OUTFILE="C:\somepath\yourcartesianproduct.sav".
* The new dataset now contains all possible combinations of rows in the two datasets.
* we will select only the relevant combinations, where the two ID's match.
select if id1=id2.
exe.