【发布时间】:2015-06-16 14:46:20
【问题描述】:
我对以下 in= 步骤的作用感到有些困惑。
代码如下:
data data1;
merge data2 data3 (in=inb);
by ID;
if inb;
run;
如果有人能告诉我这里的 in=inb 是做什么的,我将不胜感激。
【问题讨论】:
我对以下 in= 步骤的作用感到有些困惑。
代码如下:
data data1;
merge data2 data3 (in=inb);
by ID;
if inb;
run;
如果有人能告诉我这里的 in=inb 是做什么的,我将不胜感激。
【问题讨论】:
DS_A DS_B
ID VAR1 ID VAR2
A X A X
B X B X
C X D X
data want;
merge ds_a ds_b;
by id;
run;
会产生这个
WANT:
ID VAR1 VAR2
A X X
B X X
C X
D X
如果添加 IN= 选项,则添加一个临时隐藏变量,当观察值存在于该数据集中时为 1,否则为 0,如下所示:
DS_A DS_B
ID VAR1 ID VAR2
A X A X
B X B X
C X D X
data want;
merge ds_a (in=frs) ds_b (in=scn);
by id;
run;
WANT:
ID VAR1 VAR2 FRS SCN
A X X 1 1
B X X 1 1
C X 1 0
D X 0 1
因此,您可以使用此隐藏变量来保留来自一个数据集或两个数据集或仅一个数据集的观察结果......
if frs; ---> keep ID=A B C
if scn; ---> keep ID=A B D
if frs and scn ---> keep ID=A B
if frs and not scn --> keep ID=C
etc..
【讨论】:
in= 选项行为的另一个方面,我认为其他人没有提到 - 如果您使用相同的 in= 变量合并两个不同的数据集,并且一行在一个但不是另一个,值 1 优先于值 0。例如
data test;
merge sashelp.class(where = (sex = 'F') in = a)
sashelp.class(where = (sex = 'M') in = a);
by name;
put _all_;
run;
在这种情况下,对于每一行 a = 1,即使每一行仅存在于一个输入数据集中。
【讨论】:
根据SYNTAX section of the merge Statement documentation,您正在合并的数据集可以有选项。在这种情况下,您使用的是IN= Data Set Option。下面是这个选项的解释:
创建一个布尔变量,指示数据集是否为当前观察贡献了数据。
所以在这种情况下,您将这个布尔变量命名为inb。
【讨论】:
因为选项(in=inb)在data3之后,所以引用这个数据集。 因此,如果该观察值存在于 data3 中,则您将拥有一个布尔变量,该变量在 data1(最终数据集)中为 1,否则为 0。
Data2 Data3
ID ID
A A
B B
C D
你会有
Data3
ID INB
A 1
B 1
C 0
D 1
添加if INB语句;您将只保留 INB=1 的观察结果(来自 data3 的观察结果)
Data3
ID
A
B
D
【讨论】:
功能上,
merge data2 data3 (in=inb);
by ID;
if inb;
与 SQL 中的右连接相同。
从技术上讲,“inb”是一个 0/1 标志,对于 data3 中的每条记录都设置为“1”。 “如果 inb”是“如果 inb 为真 [则保留记录]”的简写,对于数字字段,“真”表示大于零。
【讨论】: