【问题标题】:SAS MERGE returns only one rowSAS MERGE 只返回一行
【发布时间】:2017-08-08 18:34:55
【问题描述】:

在 SAS 中,我运行了一个简单的线性回归,并使用以下代码将我的结果输出到 work.outdata(列包括残差、预测、标准误差):

proc reg data=model_file;
model &y = &x;
output out=work.outdata r=resid;
title 'model';
run; quit;

我正在尝试将此输出数据连接回原始数据集,称为work.modeldata。我想加入的ID是u_id。我在同一个宏中使用以下代码:

data work.mergedf;
    merge work.modeldata work.outdata;
    by u_id;
run;

但是,我新合并的数据集仅包含一行(我有数千行),u_id = 1- 该行确实已正确合并。我浏览了 SAS 文档 here,并相信我已经正确地对数据集进行了排序——所有 ID 都按升序排序,并且在每个数据集中看起来都匹配。但是,日志文件返回相同的错误:

ERROR: BY variables are not properly sorted on data set WORK.MODELDATA.

我真的不知道是什么导致了这个问题。我尝试使用PROC SORT,但是日志文件有没有人知道为什么只返回一行?

编辑:感谢乔的建议(查看已接受的答案),我得以完成这项工作。这是我使用的产生正确合并的最终代码:

proc sort data=work.model_file; by u_id; run;
proc sort data=work.outdata; by u_id; run; 

data work.merged_data;
    merge work.model_file work.outdata;
    by u_id;
run;

【问题讨论】:

  • MODELDATA 来自哪里?您的 PROC REG 仅引用了 MODEL_FILE 和 OUTDATA。
  • @data_null_ 是一样的。我只是重命名它并忘记在发布到 SO 时更改变量名称。
  • U_ID 是什么变量,为什么您认为代码中提到的三个数据集中的任何一个都会按该变量排序?
  • @Tom U_ID 是表的主键,我相信它是按该变量排序的,因为所有表当前都列出了 U_ID 升序的行。我检查了每个表的前 50 行,它们都匹配 U_IDs。
  • modeldata 表最初是存储为 SAS 数据集还是来自其他一些 DBMS?换句话说,work.modeldata 是对第三方数据库中的表执行排序操作的结果吗?

标签: sas


【解决方案1】:

如果没有看到您的实际数据就无法回答这个问题,但可以发布的是“当我认为我的数据集已排序但 SAS 不同意时该怎么办”的步骤。

  1. 在两个数据集上运行 PROC SORT。即使您认为它们已排序。如果它们已排序并且 SAS 已经知道它们是,它甚至不会对它们进行排序,否则这将按照 SAS 想要的方式对其进行排序。
  2. 如果您使用的是来自备用 DBMS 而非 SAS 的数据(因此来自 SQL Server、Oracle、Hadoop 等),请不要直接在该 DBMS 的数据上运行PROC SORT:将其作为 SAS 数据集引入 SAS ,然后PROC SORT 那个数据集。有时,其他 DBMS 会针对如何处理您不一定想要的某些情况做出不同的选择。
  3. 确保两个数据集具有相同的可变长度。这很容易成为他们不知道的问题。
  4. 确保 BY 变量确实正确,并且其中包含某些内容。我有空白 BY 变量的次数,或者有超出我预期的东西的次数太多了,无法忽略这个看似明显的细节。

【讨论】:

  • 这些都是很好的建议。不幸的是,数据根本无法发布,所以我知道它在调试方面有点限制。我最终确实让它工作了,它确实涉及正确排序两个数据集。我对我的问题进行了编辑以反映有什么帮助!
猜你喜欢
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
相关资源
最近更新 更多