sas 编程问题 lag 或 retain

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sas 编程问题 lag 或 retain相关的知识,希望对你有一定的参考价值。

数据是 9/1 25%
9/2 50%
9/3 70%
9/4 10%
9/5 20%
9/6 32%
9/7 18%
我想得出的结果是 取3天的平均数 去分别比较第4,5,6,7号 的 值 , 如果差别大于20% 就等于 true. 以此类推,再取下一组 3天 分别比较 第5,6 ,7号的值 如果差别大于20% 就等于 true., 以此类推。(就是先取1,2,3 的 平均数 和 4,5,6,7 号 比 , 再 做2,3,4 的平均数再和 5,6,7 比 ,取3,4,5 和 6,7 比, 最后 做4,5,6 的平均数 和 7 比)

参考技术A data test;
input month $ val percent5.;
cards;
9/1 25%
9/2 50%
9/3 70%
9/4 10%
9/5 20%
9/6 32%
9/7 18%
;
run;

*将后面的数据前提,使得第1233457,23456,34567,4567,567,67,7值单独一行;
Data test2;
merge test
test(firstobs=2 keep=val rename=(val=nextval2))
test(firstobs=3 keep=val rename=(val=nextval3))
test(firstobs=4 keep=val rename=(val=nextval4))
test(firstobs=5 keep=val rename=(val=nextval5))
test(firstobs=6 keep=val rename=(val=nextval6))
test(firstobs=7 keep=val rename=(val=nextval7));
run;
*计算123平均值与第4567、234与第567、345与第67、456与第7个数据相减;
data test3;
set test2;
com1 =abs( mean(val, nextval2, nextval3) - nextval4);
com2 =abs( mean(val, nextval2, nextval3) - nextval5);
com3 =abs( mean(val, nextval2, nextval3) - nextval6);
com4 =abs( mean(val, nextval2, nextval3) - nextval7);
run;
*与20%进行比较,判断TRUE和FALSE;
data test4;
set test3;
if com1 > 0.2 then flag1='TRUE' ; else if com1=. then flag1=.; else flag1='FALSE';
if com2 > 0.2 then flag2='TRUE' ; else if com2=. then flag2=.; else flag2='FALSE';
if com3 > 0.2 then flag3='TRUE' ; else if com3=. then flag3=.; else flag3='FALSE';
if com4 > 0.2 then flag4='TRUE' ; else if com4=. then flag4=.; else flag4='FALSE';
*keep month val flag1 flag2 flag3 flag4;
run;本回答被提问者和网友采纳

如何在SAS中查找变量的先前值

【中文标题】如何在SAS中查找变量的先前值【英文标题】:How to find the previous value of a variable in SAS 【发布时间】:2013-04-22 11:06:47 【问题描述】:

我正在尝试用设定的条件填充变量。

如果变量 NUMBER 等于 .然后使其等于之前的 Number 值。

data table2;
  set table1;

  prv_value = lag(number);
  if number = . then number = prv_value;
run;

但是,如果在 number = 的一行中有两个值。然后第二次出现 的值。有它以前的 number = 值。 .

我想要的是找到第一个先前出现的数字不等于 .并使 number 的值等于先前的非缺失值。

我的数据的一个例子是:

id  number
d10   2       
d10   2       
d10   3       
d10   .       
d10   .       

应用上面的代码我会得到:

id  number prv_number
d10   2       .
d10   2       2
d10   3       2
d10   3       3
d10   .       .

我想要的是:

id  number prv_number
d10   2       .
d10   2       2
d10   3       2
d10   3       3
d10   3       .

即如果 number 的值为 .然后使其等于之前第一次出现的非缺失值。

在我的数据集中的某些情况下,我可能有:

id  number
d10   4
d10   2
d10   .
d10   .
d10   .
d10   .

而我想要的是:

id  number
d10   4
d10   2
d10   2
d10   2
d10   2
d10   2

(请注意,我的数据是按事件/时间顺序排序的,因此需要第一次出现)。

对于不同数量的先前事件,我可以对 lag 函数做些什么,或者任何其他可以做我想做的事情?

【问题讨论】:

阿米尔使用保留的答案是要走的路。我建议在几乎所有情况下都不要使用 lag 函数,因为它在语义上臭名昭著,难以识别错误。 【参考方案1】:

你可以尝试使用如下的retain语句(未经测试):

data table2;
  set table1;

  retain prv_value .;

  if number=. then
    number=prv_value;

  if number ne . then
    prv_value=number;
run;

【讨论】:

嗨@Amir,我认为这不是我想要的。我试过了,我的值和以前一样。 嗨@Ellie 我尝试了您示例中的数据,并且如您所示填充了“数字”。当您运行我建议的代码时,您的示例得到了什么结果? 我现在已经开始工作了。所以 prv_value 不是现有变量(我使用 prv_value 等于数字 -prv_number 的滞后)并且是在该数据步骤中创建的。感谢您的帮助。

以上是关于sas 编程问题 lag 或 retain的主要内容,如果未能解决你的问题,请参考以下文章

SAS笔记 RETAIN语句

SAS 函数

《Objective-C 高级编程》 1.2.3节 alloc/retain/release/dealloc 实现——学习总结

Microsoft 文档在以编程方式生成 SAS 令牌时出现问题。错误:“签名字段格式不正确”

求教SAS中LAG函数的使用

为啥在sas编程的时候系统老是找不到逻辑库引用名