不使用 BY(id) 的数据步骤合并
Data step merge without using BY(id)
我需要使用数据步骤合并两个数据集,如下所示:
Data have1;
x=1; output;
x=2; output;
x=3; output;
Run;
Data have2;
y = 'A';
z = 'B';
Run;
Data want;
Merge have1 have2;
Run;
结果应该如下:
x y z
1 A B
2 A B
3 A B
然而,当我 运行 合并 SAS 仅合并第一行并给出以下内容时:
x y z
1 A B
2
3
我知道这可以使用左连接来完成,但是为了处理完整数据集中的变量,我更愿意通过合并来完成。有人可以帮忙吗?
变量Z从何而来?我想这可能就是你想要的。
Data want;
set have1;
if _n_ eq 1 then set have2;
Run;
为了解释发生了什么,当您从数据集中引入数据并“运行 出”行时,SAS 正在做什么,它将来自该数据集的所有变量设置为缺失。当您执行 set a b
(同一个 set 语句上的两个数据集)或 merge a b
而不执行 BY
或 set a; set b;
时,可能会发生这种情况,尽管数据步骤将在第一个时终止在后一种情况下,数据集 运行 超出行数,所以没关系。
为什么@data_null_的代码有效,是
if _n_ eq 1 then set b;
从不试图拉出不存在的行!它拉第一排,然后停止尝试拉。由于来自 set
或 merge
的所有变量都会自动保留,因此即使在数据步循环的第一次迭代之后,这些值也会保留(只要您不更改它们)。
我需要使用数据步骤合并两个数据集,如下所示:
Data have1;
x=1; output;
x=2; output;
x=3; output;
Run;
Data have2;
y = 'A';
z = 'B';
Run;
Data want;
Merge have1 have2;
Run;
结果应该如下:
x y z
1 A B
2 A B
3 A B
然而,当我 运行 合并 SAS 仅合并第一行并给出以下内容时:
x y z
1 A B
2
3
我知道这可以使用左连接来完成,但是为了处理完整数据集中的变量,我更愿意通过合并来完成。有人可以帮忙吗?
变量Z从何而来?我想这可能就是你想要的。
Data want;
set have1;
if _n_ eq 1 then set have2;
Run;
为了解释发生了什么,当您从数据集中引入数据并“运行 出”行时,SAS 正在做什么,它将来自该数据集的所有变量设置为缺失。当您执行 set a b
(同一个 set 语句上的两个数据集)或 merge a b
而不执行 BY
或 set a; set b;
时,可能会发生这种情况,尽管数据步骤将在第一个时终止在后一种情况下,数据集 运行 超出行数,所以没关系。
为什么@data_null_的代码有效,是
if _n_ eq 1 then set b;
从不试图拉出不存在的行!它拉第一排,然后停止尝试拉。由于来自 set
或 merge
的所有变量都会自动保留,因此即使在数据步循环的第一次迭代之后,这些值也会保留(只要您不更改它们)。