首页 > 解决方案 > Sas base:按最大表一对一读取或从下一行获取数据

问题描述

我是 sas 基地的新手,需要帮助。我有 2 个包含不同数据的表,我需要合并它。但是在步骤我需要下一行的数据。例如我需要什么:

ID  Fdate  Tdate  NFdate  NTdate

id1 date1  date1  date2   date2

id2 date2  date2  date3   date3

....

我通过2次合并做到了:

data result;
 merge table1 table2 by ...; 
 merge table1(firstobs=2) table2(firstobs=2) by...;
run;

我预计有 10 行,但得到了 9 行,因为一对一的读取在最小表的最后一行停止(合并)。我怎样才能得到最后一行(按最大表进行一对一阅读)?

标签: sas

解决方案


大多数简单的数据步骤不会在步骤的底部停止,而是在读取输入结束时停止在中间。您获得 N-1 个观察值的原因是因为第二个输入的记录少了一条。所以你需要做点什么来阻止它。

一种简单的方法是在处理第一个读取的最后一次观察时不执行第二次读取。您可以使用 END= 选项创建一个布尔变量,让您知道何时发生这种情况。

这是使用 SASHELP.CLASS 的简单示例。

data test;
  set sashelp.class end=eof;
  if not eof then set sashelp.class(firstobs=2 keep=name rename=(name=next_name));
  else call missing(next_name);
run;

结果:

                                                    next_
Obs    Name       Sex    Age    Height    Weight    name

  1    Alfred      M      14     69.0      112.5    Alice
  2    Alice       F      13     56.5       84.0    Barbara
  3    Barbara     F      13     65.3       98.0    Carol
  4    Carol       F      14     62.8      102.5    Henry
  5    Henry       M      14     63.5      102.5    James
  6    James       M      12     57.3       83.0    Jane
  7    Jane        F      12     59.8       84.5    Janet
  8    Janet       F      15     62.5      112.5    Jeffrey
  9    Jeffrey     M      13     62.5       84.0    John
 10    John        M      12     59.0       99.5    Joyce
 11    Joyce       F      11     51.3       50.5    Judy
 12    Judy        F      14     64.3       90.0    Louise
 13    Louise      F      12     56.3       77.0    Mary
 14    Mary        F      15     66.5      112.0    Philip
 15    Philip      M      16     72.0      150.0    Robert
 16    Robert      M      12     64.8      128.0    Ronald
 17    Ronald      M      15     67.0      133.0    Thomas
 18    Thomas      M      11     57.5       85.0    William
 19    William     M      15     66.5      112.0

推荐阅读