首页 文章

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

提问于
浏览
2

我创建了很多不同的数据集,但我需要创建一个变量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 回答

  • 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;
    
  • 0

    首先我认为使用时会出错: 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 ;
    
  • 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;
    
  • -1

    您可以使用数据集来存储最后使用的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;
    
  • 3

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

    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)最后,使用标记再次分离数据集,以了解每行中的数据集 .

相关问题