楼主: caibirdcnb
2929 8

[原创博文] 请问高手SAS如何根据上下几行判断,非常感谢! [推广有奖]

  • 0关注
  • 37粉丝

讲师

47%

还不是VIP/贵宾

-

威望
0
论坛币
1367 个
通用积分
16.5538
学术水平
67 点
热心指数
70 点
信用等级
64 点
经验
6762 点
帖子
206
精华
2
在线时间
433 小时
注册时间
2011-8-31
最后登录
2023-9-23

楼主
caibirdcnb 发表于 2012-10-11 11:29:40 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
SAS每次读入内存只是一行数据,但如果条件判断需要根据前面几行和后面几行进行判断,这时候后面几行数据还未读入,请问怎么预读?
请高手指导,非常感谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:非常感谢 如何

沙发
00810112 发表于 2012-10-11 17:42:03
我觉得读前面几行是不太可以操作的吧,但用lag,retain之类的可以实现对后面几行的操作吧,具体的你可以看一下sas的help文件

藤椅
bobguy 发表于 2012-10-12 07:48:34
You need to post your question in details with sample data.

板凳
caibirdcnb 发表于 2012-10-12 14:02:11
谢谢楼上两位。让我提供一个例子做参考,请继续指导。
一排产品需要做测试,但为了节省测试机器,只需要采样其中部分产品。采样逻辑是这样的:同一排如果一个产品,其邻近左边或者右边的产品有测试,则该产品不用采样;同一排如果一个产品,邻近产品没有测试,但邻近隔一个左边和右边的产品有测试,则该产品不用采样。

按照这个逻辑,数据模拟采样,如下表B列所示。

现在我的问题是:要从A列根据上面逻辑得到B列,需要根据上下多行判断,而SAS可以retain上面N行,却没有读到下面N行,那应该如何实现呢?
(一个方法是把这些行转成一行,但我想寻找不用转行列的方法)


        A        B
1        Exist        Test
2        Scrap        
3        Exist        Skip
4        Exist        Test
5        Exist        Skip
6        Exist        Skip
7        Exist        Skip
8        Exist        Test
9        Exist        Skip
10        Scrap        
11        Scrap        
12        Exist        Test
13        Exist        Skip
14        Scrap        
15        Exist        Skip
16        Exist        Test
17        Exist        Skip
18        Scrap        

报纸
iRoss2007 在职认证  学生认证  发表于 2012-10-15 14:29:01
在proc expand中有一个lead算子,可以实现对后n条观测的操作。具体楼主可以看help
文(伪)科(码)男(农), 弹幕爱好者,微软脑残粉,萧亚轩脑残

地板
kittyforever 发表于 2013-1-17 14:27:28
同问. 但之前我的解决办法是用lag, lagn函数

7
kittyforever 发表于 2013-1-17 15:30:42
proc expand
LAG [n]       
value of the series n periods earlier: xt-n

LEAD [n]       
value of the series n periods later: xt+n

8
sxlion 发表于 2013-6-28 18:16:29
hash

9
赵安豆 发表于 2025-8-18 09:54:43
在SAS中处理这类需要考虑前几行或后几行数据的问题时,可以利用`retain`语句来保存变量的值。这样可以在数据集迭代过程中保留某些变量的值,用于后续数据行的计算。

例如,假设你想要根据当前行和前两行的数据来进行判断,你可以这样做:

```sas
data want;
    set have;
   
    retain pre1 pre2;

    if _n_ > 2 then do; /* 当读取到第三行及以后时 */
        pre2 = pre1; /* 更新第二位的前置值为第一位的值 */
        pre1 = variable_name; /* 更新第一位的前置值为当前变量的值 */

        /* 在这里写你的判断逻辑,你可以使用pre1和pre2来进行计算或比较 */
        
    end;
    else if _n_ > 1 then do; /* 当读取到第二行时 */
        pre1 = variable_name; /* 更新第一位的前置值为当前变量的值 */
    end;

    /* 执行其他操作,如输出数据等 */
run;
```

注意,在SAS中并不支持“预读”下一行数据进行处理。通常的策略是在读取到某行数据后保留其状态,并在后续迭代中使用。如果需要考虑后面的数据(例如,计算移动平均),你可能需要将整个数据集读入内存或通过循环遍历两次数据集。

对于更复杂的需求,特别是在大数据集中使用窗口函数进行计算时,你可以考虑使用`PROC SQL`和分析函数,或者使用`PROC EXPAND`在时间序列数据中处理这类问题。但这些方法通常涉及到更为复杂的逻辑设计。

此文本由CAIE学术大模型生成,添加下方二维码,优先体验功能试用



您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-9 07:49