有人能一步一步地解释一下SAS数据步骤中的“by”和“if”语句在做什么吗?
我是SAS的新手,试图理解下面代码中发生的事情有人能一步一步地解释一下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的第一
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