关于数据合并:SAS中的in =选项

时间:2015-06-16 14:46:20

标签: merge sas

我对以下步骤中的内容感到有些困惑。

以下是代码:

data data1;
merge data2 data3 (in=inb);
by ID;
if inb;
run; 

如果有人能告诉我这里的in = inb,我真的很感激。

5 个答案:

答案 0 :(得分:3)

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..

答案 1 :(得分:1)

我认为没有人提到的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,即使每行只出现在其中一个输入数据集中。

答案 2 :(得分:0)

根据SYNTAX section of the merge Statement documentation,您要合并的数据集可以有选项。在这种情况下,您使用的是IN= Data Set Option。以下是此选项的说明:

  

创建一个布尔变量,指示数据集是否为当前观察提供数据。

因此,在这种情况下,您将命名此布尔变量inb

答案 3 :(得分:0)

因为选项(in = inb)在data3之后,所以它被引用到此数据集。 因此,如果数据3中存在该观察值,那么您将有一个布尔变量在data1(最终数据集)中为1,否则为0。

Data2 Data3
ID       ID
A        A
B        B
C        D

你将

Data3
ID INB
A  1
B  1
C  0
D  1

如果是INB,则添加语句;您将仅保留INB = 1的观测值(来自数据3的观测值)

Data3
ID
A
B
D

答案 4 :(得分:0)

功能上,

 merge data2 data3 (in=inb);
 by ID;
    if inb;

与SQL中的右连接相同。

技术上," inb"是0/1标志设置为" 1"对于data3中找到的每条记录。 "如果是inb"是"如果inb为真[然后保留记录]",对于数字字段"是"意味着大于零。