SAS中如何分组计数,并将值保存到宏变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SAS中如何分组计数,并将值保存到宏变量相关的知识,希望对你有一定的参考价值。
参考技术A介绍两个常用的SAS分组计数,并将计数值保存到宏变量中的方法:
程序运行的结果和日志如下:
程序输出的日志结果如下:
对于Proc SQL使用,还有一个取巧的方法,不过有出偏误的风险。计数时不使用 where 语句进行筛选特定组别,直接使用 group by 语句进行分组。这时候,计数就会有两个值,两个值保存到宏变量trt1 和 trt2中。这里宏变量名称只能通过 ‘-’ 连接,并且以数字结尾。宏变量与组别的对应关系,是与分组变量排序顺序一致的, 这里的对应关系没直接写条件那样明显 。
日志输出结果如下:
若有疑问,欢迎评论区留言。
以上。
如何在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中如何分组计数,并将值保存到宏变量的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Javascript 提示框中获取值并将其传递给 PHP 变量以便能够保存在 SQL 中?