在多个数据步骤中维护ID值

时间:2015-06-25 13:15:45

标签: sas

我创建了很多不同的数据集,但是我需要创建一个变量ID,它将在每行的第一个数据集中增加1。在下一个数据集中,我需要从最后一个数据步骤的ID变量停止的地方继续ID变量。

我尝试使用宏变量并保留语句,但它不起作用。我使用的数据集会发生变化,因此我无法手动进入并将第二个数据集设置为#40的另一个数据集。这是我到目前为止所做的一个例子:

%let test_id=1;

data work.ex1;
    set work.ex1_test;
    ID + &test_id.;
    retain ID 0;
    call symput('test_id', &test_id.+1);
    first_name= First;
run;

data work.ex2;
    set work.ex2_test;
    ID + &test_id.;
    retain ID length(&test_id.);
    call symput('test_id', &test_id.+1);
run;

5 个答案:

答案 0 :(得分:3)

你很亲密,但并不完全。

您需要将ID初始化为宏变量。然后递增它。然后将宏变量设置为新值ID

%let initial_id=0;

data work.ex1;
    set sashelp.class;
    retain ID &initial_id.;
    ID+1;
    call symputx('initial_id', ID);
    first_name= name;
run;

data work.ex2;
    set sashelp.class;
    retain ID &initial_id.;
    ID+1;
    call symputx('initial_id',ID);
run;

答案 1 :(得分:3)

首先我认为当您使用ID + &test_id;然后使用以下语句重置ID时出错:retain ID 0;

也许这会起作用。在set语句中使用end =选项:

work.ex1 end=final;

然后在数据步骤的代码底部添加:

If final then do ;
id_next=id+1;
call symput('test_id',id_next);
end;
drop id_next;

然后使用以下方法从下一个数据步骤中的上一步开始:

retain id &test_id ;

答案 2 :(得分:0)

目的。你做这一切的目的是什么?你创建ID变量的目的是什么?如果ID的唯一目的是通过寻址源表名来确定最终结果的来源,那么SAS具有您可以利用的内置功能。以下代码是使用数据步骤选项' INDSNAME ='的示例。第一部分只是为了组成一些样本表,第二部分是使用这个选项来识别障碍物。从那。这是相当直接的,所以我还没有完成在线评论。

data class1 class2 class3;
    set sashelp.class;

    if age >14 then
        output class1;

    if sex='M' then
        output class2;
    else output class3;
run;

data test;
    set class: indsname=dsn;
    dsname=dsn;
run;

答案 3 :(得分:0)

您可以使用数据集存储最后使用的ID而不是宏变量。如果您将其设为永久数据集,那么它将跨会话工作。

data lastid ;
  id=0;
run;

data a b ;
  do x=1 to 5; output; end;
run;

data new_a lastid (keep=id);
   if _n_=1 then set lastid ;
   if eof then output lastid ;
   set A end=EOF ;
   ID + 1 ;
   output new_a;
run;

data new_b lastid (keep=id);
   if _n_=1 then set lastid ;
   if eof then output lastid ;
   set b end=EOF ;
   ID + 1 ;
   output new_b;
run;

答案 4 :(得分:-1)

可能它不是最优雅的解决方案,但有一种方法可能是:

1)在每个原始数据集上放置一个标记,即:

data work.ex1;
    set work.ex1;
    mark = 1;
run;

data work.ex2;
    set work.ex2;
    mark = 1;
run;

依旧......

2)然后附加所有数据集togeher并创建id变量:

data work.all_sets;
    set work.ex1 work.ex2 ...;
    id = _n_;
run;

3)最后,使用标记再次分离数据集,以了解每行中的数据集。