Random 在SAS中为每组随机选取观察结果

Random 在SAS中为每组随机选取观察结果,random,sas,Random,Sas,我有两个数据集:具有相似表结构的表单和池 a) 数据集表单 b) 数据集池 上述两个数据集有三列,其中表单数据集中的每个键和级别组合有4行 此外,子级数据在表和池数据在键和级上是互斥的 子级别值具有特定的级别,即级别和子级别遵循层次结构 我想用池中的子级别值填充表单数据集中子级别列下的空值,其中池数据集中的子级别应属于表单的同一键和级别数据集 在SAS中如何做到这一点 编辑1:在表单数据集中填充的空值在每个级别的键组中必须是不同的或唯一的 在表单:键,级别,新建行标识 在组级别上对池进行

我有两个数据集:具有相似表结构的表单和池

a) 数据集表单

b) 数据集

  • 上述两个数据集有三列,其中表单数据集中的每个级别组合有4行

  • 此外,子级数据在数据在上是互斥的

  • 子级别值具有特定的级别,即级别子级别遵循层次结构

我想用池中的子级别值填充表单数据集中子级别列下的空值,其中数据集中的子级别应属于表单的同一级别数据集

在SAS中如何做到这一点

编辑1:在表单数据集中填充的空值在每个级别的键组中必须是不同的或唯一的

  • 表单
    级别
    新建行标识
  • 在组级别上对池进行随机排序,并创建相同的id
  • 通过
    级别
    新id
    左键连接,并替换缺少的值
  • 由于
    表单
    中每个组的值少于或等于
    中的值,并且所有值都是不相交且唯一的,因此您将完成
    表单
    ,而不会生成重复项

    代码示例:

    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;
    
    编辑: 如果
    组中的行数少于
    窗体
    , 在
    表格中更改
    新的\u id

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

    您的标题和标签中提到的随机性组件来自何处?@多余:随机性出现在图片中,同时从“池”数据集中随机选择子_级别,以填充“表单”表中“子级别”列中的空值。谢谢您的回复,但我认为我先前的问题遗漏了另一个约束条件,我已将其包含在原始问题的“编辑1”中。实际上,被替换的值在每个“键”和“级别”组中也必须是唯一的。如果您能帮忙,我将不胜感激。我相应地调整了我的答案。谢谢@Jetzler:这很有帮助!!