SAS:Data step中使用FIRST和LAST变量筛选每一组中的第1条和最后1条观测

在SAS的DATA步中,可以使用by分组,在处理过程中会产生两个临时变量FIRST.variable和LAST.variable,这两个临时变量的值不会写到结果集中。

这两个临时变量的赋值情况如下:

由于DATA step是按行处理每一条观测的,当一条观测为某一组的第一条记录时,那么FIRST.variable就为1,否则为0;每当一条观测为某一组的最后一条记录时,LAST.variable就为1,否则为0; 如果一个组中只有一个观测,那么两者皆为1。

 

因此,可以使用这两个变量来筛选每一组中的第1条或最后1条观测。

 

以sashelp.class为例子,原始数据如下:

 

现在如果我们分别输出男生和女生中年龄最大和最小的人的信息怎么办? 可以先按照性别和年龄排序,然后按照姓别分组,只取每一组中的第一条和最后一条观测即可。

 

第1步是先按照姓别和年龄排序,输出到临时表tmp1中。

 

然后将tmp1中的数据按照sex分组,只取每一组的第一条和最后一条数据即可

 

这里的 if FIRST.sex eq 1 OR LAST.sex eq 1就表示如果是一组的第1条观测或者最后1条观测,就继续。

 

事实上,如果在if前面加上put _all_语句,可以在SAS LOG中看到每个变量的值,包括了FIRST.variable和LAST.variable,如下:

666
667  data tmp2;
668     set tmp1;
669     by sex;
670     put _all_;
671     if FIRST.sex eq 1 OR LAST.sex eq 1;
672  run;

Name=托马斯 Sex=男 Age=11 Height=57.5 Weight=85 FIRST.Sex=1 LAST.Sex=0 _ERROR_=0 _N_=1
Name=詹姆斯 Sex=男 Age=12 Height=57.3 Weight=83 FIRST.Sex=0 LAST.Sex=0 _ERROR_=0 _N_=2
Name=约翰 Sex=男 Age=12 Height=59 Weight=99.5 FIRST.Sex=0 LAST.Sex=0 _ERROR_=0 _N_=3
Name=罗伯特 Sex=男 Age=12 Height=64.8 Weight=128 FIRST.Sex=0 LAST.Sex=0 _ERROR_=0 _N_=4
Name=杰弗瑞 Sex=男 Age=13 Height=62.5 Weight=84 FIRST.Sex=0 LAST.Sex=0 _ERROR_=0 _N_=5
Name=阿尔弗雷德 Sex=男 Age=14 Height=69 Weight=112.5 FIRST.Sex=0 LAST.Sex=0 _ERROR_=0 _N_=6
Name=亨利 Sex=男 Age=14 Height=63.5 Weight=102.5 FIRST.Sex=0 LAST.Sex=0 _ERROR_=0 _N_=7
Name=罗纳德 Sex=男 Age=15 Height=67 Weight=133 FIRST.Sex=0 LAST.Sex=0 _ERROR_=0 _N_=8
Name=威廉 Sex=男 Age=15 Height=66.5 Weight=112 FIRST.Sex=0 LAST.Sex=0 _ERROR_=0 _N_=9
Name=菲利普 Sex=男 Age=16 Height=72 Weight=150 FIRST.Sex=0 LAST.Sex=1 _ERROR_=0 _N_=10
Name=乔伊斯 Sex=女 Age=11 Height=51.3 Weight=50.5 FIRST.Sex=1 LAST.Sex=0 _ERROR_=0 _N_=11
Name=简 Sex=女 Age=12 Height=59.8 Weight=84.5 FIRST.Sex=0 LAST.Sex=0 _ERROR_=0 _N_=12
Name=罗伊斯 Sex=女 Age=12 Height=56.3 Weight=77 FIRST.Sex=0 LAST.Sex=0 _ERROR_=0 _N_=13
Name=爱丽丝 Sex=女 Age=13 Height=56.5 Weight=84 FIRST.Sex=0 LAST.Sex=0 _ERROR_=0 _N_=14
Name=芭芭拉 Sex=女 Age=13 Height=65.3 Weight=98 FIRST.Sex=0 LAST.Sex=0 _ERROR_=0 _N_=15
Name=凯露 Sex=女 Age=14 Height=62.8 Weight=102.5 FIRST.Sex=0 LAST.Sex=0 _ERROR_=0 _N_=16
Name=茱迪 Sex=女 Age=14 Height=64.3 Weight=90 FIRST.Sex=0 LAST.Sex=0 _ERROR_=0 _N_=17
Name=雅妮特 Sex=女 Age=15 Height=62.5 Weight=112.5 FIRST.Sex=0 LAST.Sex=0 _ERROR_=0 _N_=18
Name=玛丽 Sex=女 Age=15 Height=66.5 Weight=112 FIRST.Sex=0 LAST.Sex=1 _ERROR_=0 _N_=19
NOTE: 从数据集 WORK.TMP1. 读取了 19 个观测
NOTE: 数据集 WORK.TMP2 有 4 个观测和 5 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.01 秒

 

  • 8
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
SAS,可以使用PROC TRANSPOSE过程将数据从宽格式转换为长格式或从长格式转换为宽格式。如果您想将最后一列的变量调整到第四列,可以按照以下步骤执行: 1. 使用PROC TRANSPOSE过程将数据从宽格式转换为长格式,将最后一列的变量转换为一列新的变量,并将所有变量的名称存储在一个名为"variable"的新变量。例如,假设您的数据集名为data最后一列的变量名为var5,则可以使用以下代码将数据转换为长格式: ``` proc transpose data=data out=long_data; var var1-var4 var5; id id; run; ``` 这将创建一个名为long_data的新数据集,其包含五列:id、variable、_name_、_label_和col1。其,id列包含数据集的每个观测值的标识符,variable列包含所有变量的名称,_name_列包含原始数据集变量名称,_label_列包含原始数据集变量的标签(如果有),col1列包含所有变量的值。 2. 使用DATA步骤将数据从长格式转换为宽格式,并按照您想要的顺序将变量重新排列。例如,假设您想要将最后一列的变量移动到第四列,则可以使用以下代码: ``` data wide_data; set long_data; by id variable; if last.variable; length var1-var4 $20 var5 $20; retain var1-var3 var5; if _name_ = "var1" then var1 = col1; if _name_ = "var2" then var2 = col1; if _name_ = "var3" then var3 = col1; if _name_ = "var5" then var4 = col1; drop _name_ _label_ col1; run; ``` 这将创建一个名为wide_data的新数据集,其包含四列:id、var1、var2和var3。其,id列包含数据集的每个观测值的标识符,var1至var4列包含您想要的变量,每列的名称对应于变量的顺序。在此示例,var5被移动到了第四列,并被重新命名为var4。注意,此代码使用BY语句将数据按照id和variable排序,以确保观测值按照正确的顺序处理。RETAIN语句用于保留前一个观测变量值,以便在当前观测使用。IF语句用于将每个变量的值从长格式提取到宽格式的正确位置。最后使用DROP语句删除不需要的变量

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值