如何在 SAS 的 if 条件下创建新行?

How do I create a new row within an if-condition in SAS?

我有:

Number Cost Amount
52 98 1
108 50 3
922 12 1

我想要的:

Number Cost 
52 98 
108 50 
109 50
110 50
922 12 1

我的数据集有一个变量 Amount。如果某一行的金额为 2,我想在其正下方创建一个新行,其成本和数字等于上一行的数字 + 1。如果金额为 3,我想在右侧创建两个新行在它下面,两者具有相同的成本,并且数字是 +1 上方行中的数字和 +2 上方行中的数字,依此类推。 我的最后一步是删除 Amount 列,我可以用

data want (drop=Amount);
    set have;

我在实现这个时遇到问题,我的想法是使用 proc sql insert in 但我无法将它与贯穿 amount 变量的 if 条件结合起来。

重现代码table:

proc sql;
   create table want
       (Number num, Cost num, Amount num);

insert into want
    values(52,98,1)
    values(108,50,3)
    values(922,12,1);

这可以帮助你:

proc sort data=want out=want_s nodupkey;
  by Number;
run;
data result;
  keep Number Cost;
  set want_s;
  do i=1 to Amount;
    output;
    Number=Number+1;
  end;
run;

您可能需要注意 Number 不会与下一个输入行重叠,如下所示:

Number ; Amount
108 ; 10
110 ; 1

使用DO循环输出AMOUNT行数。您可以编写循环的 index 变量以递增 NUMBER

示例(未经测试)

data want(keep=number cost);
  set have;
  do number = number to number + amount-1;
    output;
  end;

但是,在某些情况下,您可能不需要执行此数据扩展。许多 SAS 过程提供 WEIGHTFREQ 语句,允许变量执行该统计或处理角色。