在SAS

时间:2016-06-30 11:59:31

标签: random sas

我有两个数据集: form pool 具有相似的表结构。

a)数据集 表单 enter image description here

b)数据集 pool dataset

  • 以上两个数据集有三列,每个 级别 组合在 表单 数据集有4行。

  • 池< 次级 数据/ em> 数据在 密钥 级别 级别互斥。

    < / LI>
  • 子级别 值分配了特定的 级别 ,即 < em> Level Sub-Level 遵循层次结构。

我想填充 表单 子级别 列下的空值 数据集中子级值的数据集,其中 子级别 pool 数据集shoud属于同一 级别 < / strong> 表单 数据集。

如何在SAS中完成这项工作?

表单 数据集填充的

编辑1 空值在每个数据集中必须是唯一的或唯一的一组 键,级别

1 个答案:

答案 0 :(得分:1)

  1. form中创建新的行ID:keylevelnew_id
  2. 在组级别上随机排序pool并创建相同的ID。
  3. keylevelnew_id左连接并替换缺失的值。
  4. 由于formpool相比,每个组的值越来越少或相等,并且所有值都是分离且唯一的,因此您将完成form而不会生成重复项。

    代码示例:

    data form;
      set form;
      retain new_id;
      if first.level then new_id = 0;
      new_id + 1;
    run;
    data pool;
      set pool;
      ran_num = ranuni(12345); /* generate random uniform number */
    run;
    proc sort data=pool; by key level ran_num; run; /* sort by random number */
    data pool;
      set pool;
      retain new_id;
      if first.level then new_id = 0;
      new_id + 1;
    run;
    proc sql;
    create table form_full as
      select a.key, a.level, coalescec(a.sub_level,b.sub_level) as sub_level
        from form a
          left join pool b
            on a.key eq b.key and a.level eq b.level and a.new_id eq b.new_id
          ;
    quit;
    

    编辑: 如果pool组中的行数少于form, 更改new_id中的form

    data form;
      set form;
      retain new_id;
      if first.level then new_id = 0;
      if sub_level ne . then new_id + 1;
    run;