在重构一些代码时,我试图复制各种数据集。我以如下方式确认重构。我导入实时/原始数据集,对其进行排序by _all_
。我对重构数据集by _all_
进行排序。然后我比较两者。SAS - 数据集未按预期排序
%macro Validate(dataset);
data live_&dataset.;
set inFinal.&dataset.;
run;
proc sort data = live_&dataset. out = validation_original;
by _all_;
run;
proc sort data = &dataset. out = validation_refactor;
by _all_;
run;
proc compare error note
base = validation_original
compare = validation_refactor
;
run;
%mend;
这有效,但对于一个奇怪的情况。该数据集包含begin_date
和end_date
。 PROC COMPARE
在这些值上引发错误。当我调查时,碰巧有两行包含相同的值,但对于begin_date
和end_date
。尽管已经通过PROC SORT
运行,但原始数据集未正确排序。
Refactored Dataset
|-----+-----------+-------------+------+------------+------------+-------+-------+-------|
| id | numerator | denominator | rate | begin_date | end_date | junk1 | junk2 | junk3 |
|-----+-----------+-------------+------+------------+------------+-------+-------+-------|
| 123 | 0 | 0.41504 | 0 | 10/01/2015 | 10/31/2015 | ABC | XYZ | IOU |
|-----+-----------+-------------+------+------------+------------+-------+-------+-------|
| 123 | 0 | 0.41504 | 0 | 11/01/2015 | 11/30/2015 | ABC | XYZ | IOU |
|-----+-----------+-------------+------+------------+------------+-------+-------+-------|
Original Dataset
|-----+-----------+-------------+------+------------+------------+-------+-------+-------|
| id | numerator | denominator | rate | begin_date | end_date | junk1 | junk2 | junk3 |
|-----+-----------+-------------+------+------------+------------+-------+-------+-------|
| 123 | 0 | 0.41504 | 0 | 11/01/2015 | 11/30/2015 | ABC | XYZ | IOU |
|-----+-----------+-------------+------+------------+------------+-------+-------+-------|
| 123 | 0 | 0.41504 | 0 | 10/01/2015 | 10/31/2015 | ABC | XYZ | IOU |
|-----+-----------+-------------+------+------------+------------+-------+-------+-------|
我不能说明这是为什么。错误排序只发生在这个特定的数据集上。当我通过PROC CONTENTS
检查内容时,它们是相同的:它们具有相同数量的观察值,相同的类型,相同的len,相同的格式,相同的排序顺序,相同的编码。一切似乎都是一样的。
- 是否有另一种方法来验证两个数据集?
- 这可能是
PROC SORT
的错误吗? - 可能是日期如何在内存中表示的结果? (即浮点表示错误)
计算分母时使用'round'函数(例如5个d.p.)将确保所有数据集的一致性。 – Longfish