删除一些数据后,SAS会计算逐个组内的观察数

时间:2017-07-09 23:32:22

标签: sas

我有一个数据集,其格式类似于以下内容:

| Symbol | Date     | Time | BB | BO | MIDPRICE |
|--------|----------|------|----|----|----------|
| AAPL   | 20130102 | 1    | 2  | 3  | 2.5      |
| AAPL   | 20130102 | 2    | 2  | 3  | 2.5      |
| AAPL   | 20130102 | 3    | 1  | 3  | 1.5      |
| ...    |          |      |    |    |          |
| AAPL   | 20130102 | 100  | 3  | 4  |  3.5     |
| FB     | 20130102 | 1    | 3  | 6  | 4.5      |
| FB     | 20130102 | 2    | 3  | 6  | 4.5      |
| FB     | 20130102 | 3    | 3  | 5  | 4        |
| ...    |          |      |    |    |          |
| FB     | 20130102 | 100  | 3  | 4  |  3.5     |

我正在尝试计算每个组中的观察数量。

例如,如果数据集按符号排序,我想知道AAPL,FB等分别有多少观察结果。在上述情况下,AAPL有四个观察值,FB有四个观察值。

我希望稍后将结果导出到数据集和csv文件(我了解如何导出到csv文件,因此它不是此问题的一部分)。

我一直在网上阅读资料。似乎一般有两种方式。在这个document中,作者说nobs可能不准确,特别是如果您修改了原始数据集。不幸的是,对我来说就是这种情况。我使用以下代码删除了一些观察结果:

  data STOCK;
    SET RAWDATA; by SYMBOL;
    /* Delete those with only one observation */
    if MIDPRICE < 3 then delete;
  run;

因此,根据这个stackoverflow post,剩下的唯一选择是sql语句。但是,帖子中使用的SQL语句只计算观察总数,而不是按组计算每个观察值。

我还想过通过递增变量来计算。但似乎这是一个非常糟糕的选择表现明智。

因此,我想知道是否有任何高性能,同时防错的方式呢?

我正在操作的数据集非常大。每个数据集通常为30太字节+,我有数以千计来运行我的代码。

谢谢!

2 个答案:

答案 0 :(得分:2)

我会使用proc sql

proc sql;
    create table newtable as
        select symbol, count(*) as cnt
        from stock
        group by symbol;
quit;

答案 1 :(得分:0)

我最后使用了以下代码:

data quotescount;
    set quotes_processed; by Symbol;
    if first.Symbol then count=0;
    count+1;
    if last.Symbol then output;
run;

这似乎是最可靠的方法,因为SQL查询可能会返回wrong results