SAS复制使用前一行项目的简单excel公式(减法)

SAS复制使用前一行项目的简单excel公式(减法),sas,Sas,我正在尝试自动化一个在excel中完成的过程。我有一个如下的数据集 data test; input months count_id; datalines; 0 0 1 787 2 1283 3 1258 4 1579 5 1695 6 1831 7 2060 8 2337 9 2384 ; run; 我希望创建一个新列,其中months的值为0,1是所有值的总和。但在2个月及以下的时间内,应按照所示公式计算。我如何做到这一点。我最初想将数据集months>=2进行拆分,但意识到我必须使用m

我正在尝试自动化一个在excel中完成的过程。我有一个如下的数据集

data test;
input months count_id;
datalines;
0 0
1 787
2 1283
3 1258
4 1579
5 1695
6 1831
7 2060
8 2337
9 2384
;
run;


我希望创建一个新列,其中months的值为0,1是所有值的总和。但在2个月及以下的时间内,应按照所示公式计算。我如何做到这一点。我最初想将数据集months>=2进行拆分,但意识到我必须使用month1的值进行拆分。

首先需要获取总计(我使用
proc sql
将总计存储在宏变量中)。然后您只需使用
lag
访问前一行的变量

proc sql;
 select sum(count_id) into :total from test;
quit;

data result;
 set test;
 retain sum;
 if months < 2 then sum = &total;
 sum = sum(sum, -lag(count_id));
run;
proc-sql;
将总和(count_id)选择为:来自测试的总和;
退出
数据结果;
集合测试;
保留金额;
如果月份<2,则总和=&total;
sum=sum(sum,-lag(count_id));
跑

首先获取总数。因此,您可以使用PROC SUMMARY

proc summary data=test ;
  var count_id ;
  output out=total sum=sum ;
run;
现在处理数据。使用LAG()函数将获得COUNT_ID的上一个值,但是LAG()函数只创建一个值堆栈,因此如果您跳过执行它以进行某些观察,那么这些值将永远不会进入堆栈。因此,您需要对每个值执行LAG()函数,以使其正常工作。由于从数据集中提取
SUM
变量,它将在数据步骤的迭代中自动保留,因此不需要“滞后”它。当前值已经是上一个数据步迭代中的值,所以只需减去滞后计数

data want ;
  set test ;
  if _n_=1 then set total (keep=sum);
  lag_count = lag(count_id);
  if months > 1 then sum = sum - lag_count ;
run;
如果您希望前两个值相同的原因只是因为COUNT_ID的第一个值为零,那么您可以进一步简化并消除将LAG()值保存到单独变量中的需要。使用
sum(,)
函数处理
lag(count\u id)
将在数据步骤的第一次传递中丢失的事实

data want ;
  set test ;
  if _n_=1 then set total (keep=sum);
  sum = sum(sum, - lag(count_id)) ;
run;

=N3-M3
的值是多少?你是说15214-787吗?是的,你是对的,公式应该在2和2以上重复,与此类似,下一个是N4-M4,它将是((15214-787)-1283)…IF语句将搞乱滞后()函数调用,因此当months=2时,sum将丢失,因为您将从空堆栈中提取值。@david25272是,正如TOM提到的,它在months 2及以上的缺失现在应该得到修复。