有人能一步一步地解释一下SAS数据步骤中的“by”和“if”语句在做什么吗?

有人能一步一步地解释一下SAS数据步骤中的“by”和“if”语句在做什么吗?,sas,Sas,我是SAS的新手,试图理解下面代码中发生的事情 data def; set abc; by id; if last.id; run; 我知道by用于按id列排序,但如果last.id在做什么呢 非常感谢你的帮助 data def; 创建一个名为DEF的数据集,该数据集将存储在默认库工作中 从数据集ABC获取您的输入,sas将在默认库工作中查找该数据集,这将自动在观测1上生成一个循环 添加临时变量2 first.id和last.id,以指示这是否是id为3的第一

我是SAS的新手,试图理解下面代码中发生的事情

data def;
     set abc;
      by id;
     if last.id;
run;
我知道by用于按id列排序,但如果last.id在做什么呢

非常感谢你的帮助

data def;
创建一个名为DEF的数据集,该数据集将存储在默认库工作中

从数据集ABC获取您的输入,sas将在默认库工作中查找该数据集,这将自动在观测1上生成一个循环

添加临时变量2 first.id和last.id,以指示这是否是id为3的第一次/最后一次观察

以下所有语句以及隐式输出;语句,将仅应用于每个id的最后一次观察。如果不是last.id,则等效于delete

编译上述文件并运行

1在SAS数据步骤中,您几乎不应该编写以下内容

read file;
while not eof;
    do some stuf;
    read file;
end;
这是由set和merge语句自动完成的

2临时变量存在于程序向量中,即数据集中的范围内,但未写入输出数据集中

3 SAS术语中的单词observation与数据库术语中的row相同。与记录不同的是,sas表与数据库一样,知道自己的结构。 没有这些,by语句和该语言的许多其他功能就不可能存在。

if last.id;
是一种特殊形式的if,与其他编码语言不同,注意没有THEN子句。该表格称为子集if。仅当测试表达式为true时,才会出现超出该范围的数据步控制流

在代码中,测试表达式是last.id

最后。首先对应。是为每个BY变量创建的两个自动临时变量,指示当前行是否位于组边缘行;按组级别列出的组的第一行或最后一行

您可以推断有关当前观察在组中的位置的信息

FIRST.  LAST.   where
  1             at first in group
  0             not at first in group
          1     at last in group
          0     not at last in group
  1       0     group has >= 2 rows and currently at first in group
  0       0     group has >= 3 rows and currently in the middle part
  0       1     group has >= 2 rows and currently at last in group
  1       1     group has only 1 row
您确实需要了解数据/集处理的隐式循环的基本前提:

SUGI 30纸是一种很好的入门纸 Debbie Buck,德克萨斯州休斯顿市D.B.和P.Associates公司。 伊恩·惠特洛克的论文是最好的。试试他的SUGI 31
run;
read file;
while not eof;
    do some stuf;
    read file;
end;
if last.id;
FIRST.  LAST.   where
  1             at first in group
  0             not at first in group
          1     at last in group
          0     not at last in group
  1       0     group has >= 2 rows and currently at first in group
  0       0     group has >= 3 rows and currently in the middle part
  0       1     group has >= 2 rows and currently at last in group
  1       1     group has only 1 row