Sas 按条件垂直求和
我查看了前一篇文章,寻找可能的解决方案,但仍然不起作用。我想使用ID作为公共标识符对行进行求和。num变量是常量。id和comp是我想要用来创建pct变量的两个变量,它=[comp=1]/num之和 拥有: 想要: 目前有:Sas 按条件垂直求和,sas,Sas,我查看了前一篇文章,寻找可能的解决方案,但仍然不起作用。我想使用ID作为公共标识符对行进行求和。num变量是常量。id和comp是我想要用来创建pct变量的两个变量,它=[comp=1]/num之和 拥有: 想要: 目前有: proc sort data=have; by id; run; data want; retain tot 0; set have; by id; if first.id then do; tot =
proc sort data=have;
by id;
run;
data want;
retain tot 0;
set have;
by id;
if first.id then do;
tot = 0;
end;
if comp in (1) then tot + 1;
else tot + 0;
if last.id;
pct = tot / num;
keep id tot pct;
output;
run;
我使用SQL来处理类似的事情。您可以在数据步骤中完成,但SQL更紧凑
data have;
input id Comp Num;
datalines;
1 1 2
2 0 3
3 1 1
2 1 3
1 1 2
2 1 3
;
run;
proc sql noprint;
create table want as
select id,
sum(comp) as tot,
sum(comp)/count(id) as pct
from have
group by id;
quit;
我使用SQL来处理类似的事情。您可以在数据步骤中完成,但SQL更紧凑
data have;
input id Comp Num;
datalines;
1 1 2
2 0 3
3 1 1
2 1 3
1 1 2
2 1 3
;
run;
proc sql noprint;
create table want as
select id,
sum(comp) as tot,
sum(comp)/count(id) as pct
from have
group by id;
quit;
您好,您的问题有一个更优雅的解决方案:
proc sort data = have;
by id;
run;
data want;
do _n_ = 1 by 1 until (last.id);
set have ;
by id ;
tot = sum (tot, comp) ;
end ;
pct = tot / num ;
run;
我希望这是清楚的。我也使用sql,因为我是新手,DOW循环相当复杂,但在您的情况下,它非常简单。您好,有一个更优雅的解决方案来解决您的问题:
proc sort data = have;
by id;
run;
data want;
do _n_ = 1 by 1 until (last.id);
set have ;
by id ;
tot = sum (tot, comp) ;
end ;
pct = tot / num ;
run;
我希望这是清楚的。我也使用sql,因为我是新手,DOW循环相当复杂,但在您的例子中它非常简单。一个后续问题:为什么我会丢失have数据集中的所有变量,而输出只包含sql语句中的三个变量?因为sql语句定义了将输出哪些变量。SAS文档PROC SQL非常好,有很多相关示例。这就是我自学SQL语法的方法。接下来的一个问题是:为什么我会丢失have数据集中的所有变量,而输出只包含SQL语句中的三个变量?因为SQL语句定义了将输出哪些变量。SAS文档PROC SQL非常好,有很多相关示例。我就是这样自学SQL语法的。