首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据SAS中的多个字段选择前3项观测?

根据SAS中的多个字段选择前3项观测?
EN

Stack Overflow用户
提问于 2014-07-03 20:55:33
回答 1查看 1.1K关注 0票数 2

我有一个非常大的SAS数据集,其中包含了基于多个字段的前3条记录的总和。

数据的一个例子:

数据图像

假设数据是正确排序的,即按Ref、Date1(desc)、Time(desc)、Date2(Desc)排序。“Sum”字段不存在于数据集中(见下文)。

使用SAS,我需要对每个Date1实例的每个引用的前3个最近值(基于Date2和Time)进行求和。在示例数据中,“sum”字段是数据需要被求和的方式,即,所有1s在一起,2s在一起,等等。

对于这个糟糕的解释,我道歉,几天来我一直试图这样做,但没有结果!

非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-04 03:11:53

这应该能起作用。您需要使用使用by语句启用的分组处理。然后,您可以使用first.last.表示法来知道何时到达每个组的开始或结束。retain语句通知sas哪些变量应该通过观察来记住它们的值。

样本数据:

代码语言:javascript
复制
data tmp;
  informat date1 date2 ddmmyy10.;
  input ref 
        date1 
        date2 
        time
        value
        ;
datalines;
11 03/01/2014 01/01/2014 9 345
11 03/01/2014 01/01/2014 8 322
11 03/01/2014 01/01/2014 7 6546
11 01/01/2014 31/12/2013 6 34
11 01/01/2014 31/12/2013 5 33
22 02/01/2014 01/01/2014 4 234
22 02/01/2014 01/01/2014 3 66
22 01/01/2014 01/01/2014 2 234
33 01/01/2014 01/01/2014 1 2
33 01/01/2014 31/12/2014 0 45
;
run;

然后确保数据正确排序,以便我们可以按组处理使用:

代码语言:javascript
复制
proc sort data=tmp;
  by ref date1 date2 descending time;
run;

由于sum()语句仅在计数器为<= 3时累积求和,因此您将得到每个by组前3个值的和。当到达组结束时,将输出一个记录。

代码语言:javascript
复制
data tmp2;
  set tmp;
  by ref date1 date2;
  retain counter total .;

  if first.date2 then do; 
    total = 0;
    counter = 1;
  end;

  if counter le 3 then do;
    total = sum(total,value);
  end;

  if last.ref or last.date1 or last.date2 then do;
    output;
  end;

  counter = counter+1;

run;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24563179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档