如何在 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 过程提供 WEIGHT 或 FREQ 语句,允许变量执行该统计或处理角色。
我有:
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 过程提供 WEIGHT 或 FREQ 语句,允许变量执行该统计或处理角色。