SAS 与 Matlab 的显着不同在于,Matlab 有向量和矩阵,而基本 SAS 没有。Base SAS 比矩阵语言更接近 SQL;您操作行内的列。如果您想将 SAS 视为一种矩阵语言,请查看您是否已SAS-IML
获得许可(PROC SETINIT; RUN;
应该向您显示您已获得许可,或询问您的 SAS 管理员)。该语言与 Matlab 非常相似。
至于使用基本 SAS 来解决这个问题,你做什么取决于你的目标。如果只是将每一行与上一行 [或下一行,因为这两个目标相同] 进行比较,您可以使用PROC COMPARE
.
例如:
data class_one/view=class_one;
set sashelp.class(firstobs=2);
run;
proc compare base=sashelp.class compare=class_one out=class_compare;
run;
有很多选项PROC COMPARE
可以让它完全符合您的要求,请参阅文档了解更多详细信息。
您还可以非常轻松地将匹配合并到下一行。
data want;
merge sashelp.class(in=a) sashelp.class(in=b firstobs=2 rename=(...) keep=...);
... do stuff ...
run;
但是,您需要重命名来自第二个数据集的变量,否则它们将覆盖第一个数据集的变量,并使用该keep
选项仅保留您正在使用的变量 - 并keep
使用原始名称,而不是重命名的姓名。然后在...do stuff...
您输入您用于将行与下一行进行比较的任何代码。如果“上一行”很重要(即,您希望行 [2..n] 作为最终输出,而不是 [1..n-1]),则将 firstobs=2 移动到第一个数据集。(这告诉它跳过第一次观察,所以一个数据集从 1 开始,一个从 2 开始,然后都迭代超过该值。)
如果您只是检查行号,这会更容易一些。你可以这样做:
data want;
set have;
by num notsorted; *notsorted is needed unless you do expect it to be in numeric order;
if first.num then first_obs_for_rownum=1;
if last.num then last_obs_for_rownum=1;
run;
显然你可以用这些条款做其他事情then
,我只是想弄清楚他们做了什么。 if first.num and last.num
将表明一行是由 rownumber 唯一的(至少,按照数据集上的顺序 - 如果它未排序,则相同的 num 可能出现在其他地方,但不会出现在该行之前/之后)。 first.num
是一个 1/0 变量,指示上一行是否具有不同 (1) 或相同 (0) 的值num
;last.num
是一个 1/0 变量,指示下一行是否具有不同 (1) 或相同 (0) 的值num
。first.id
first.name
只要它们by
以某种方式出现在语句中,它们就可以用于任何变量(因此等对这些变量起作用);如果你有多个变量by
语句,每次重置该变量左侧的任何变量时都会重置它们。