我有一个数据集,其格式类似于以下内容:
| 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太字节+,我有数以千计来运行我的代码。
谢谢!
答案 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。