sas - 如果在特定条件下,前一行值与当前标志不匹配,则 SAS 将 1 添加到标志
问题描述
我有一个正在创建的表,我们会说第 1 列是 YearMonth,第 2 列是标志。
年月旗 200101 1 200102 1 200103 0 200104 1 200105 1 200106 0 200107 1 200108 0
注意:标志列的第一个条目将始终为 1。
如果当前标志与前一行值以及一个主要条件不匹配,我想将 1 添加到标志(在输出后进行解释以获得更好的解释)。
输出应该是:
年月旗阶段 200101 1 1 200102 1 1 200103 0 2 200104 1 3 200105 1 3 200106 0 4 200107 1 3 200108 0 4
请注意,只有 4 个阶段。因此,如果一个标志在第 4 阶段之后重复,那么它不应该增加,并且应该在标志 = 1 时作为阶段 = 3 或在标志 = 0 时作为阶段 = 4 给出输出。
我正在尝试这样的事情:
data one;
set Query;
Stage=lag(flag);
if first.flag then Stage=1;
if first.flag then Stage=1;
if flag ne Stage+1 then Stage=Stage+1;
run;
解释为什么此代码不起作用会非常有帮助。谢谢!
另外,我知道一旦达到第 4 阶段,我就不会做任何事情。
解决方案
这本质上是对观察组进行计数。所以使用 BY 组处理。在 BY 语句中添加 NOTSORTED 关键字,这样 SAS 就不会抱怨这些值没有排序。开始新组时增加计数器。
data want;
set have;
by flag notsorted;
stage + first.flag;
run;
要添加您的第二个条件,您只需添加此行
stage = min(stage,4 - flag);
推荐阅读
- c# - 我可以使用 dotnet publish 命令构建 .NET Framework 应用程序吗?
- php - 将 Json 字符串转换为 PHP 对象数组时出错
- android - 设置为 wrap_content 时,CardView 大小不是动态的
- c - 如何使用scanf函数获取字符串长度
- react-native - 从 useSelector 获取相关值
- powershell - 在powershell中将行与字符串变量进行比较
- swift - 如何快速向 UIViewController 添加左右栏按钮
- sql - 使用 sql 查询文本字符串 - 如何按类别查找单词序列
- tableau-api - 在 Tableau 中连接来自 2 个字符串维度的数据
- reporting-services - SSRS:将计算的行放在另一行下方