【问题标题】:how to create variable column from my table SAS 4GL - RETAIN?如何从我的表 SAS 4GL - RETAIN 创建变量列?
【发布时间】:2019-07-17 10:18:03
【问题描述】:

我有以下格式的数据集。前 5 个变量已经存在。我需要创建“NEED_TO”。

这意味着在列 MTH_SATTL 上带有“1”的行之后,当 START 列上的日期比 DATA 列上的日期更早时,然后填写 1 直到下一个 GROUP nad GR_ROZL。

我尝试使用 RETAIN 语句,但我认为我的语法有问题

Data        Start       Group   GR_ROZL MTH_SATTL   Need_to
01OCT2019   .           G11     2       0           0
01NOV2019   .           G11     2       0           0
01DEC2019   .           G11     2       0           0
01JAN2020   01JAN2020   G11     2       0           0
01FEB2020   01JAN2020   G11     2       1           1
01MAR2020   01JAN2020   G11     2       0           1
01APR2020   01JAN2020   G11     2       0           1
01OCT2019   .           G11     3       0           0
01NOV2019   .           G11     3       0           0
01DEC2019   .           G11     3       0           0
01JAN2020   01JAN2020   G11     3       0           0
01FEB2020   01JAN2020   G11     3       0           0
01MAR2020   01JAN2020   G11     3       1           1
01APR2020   01JAN2020   G11     3       0           1
01OCT2019   .           G12W    2       0           0
01NOV2019   .           G12W    2       0           0
01DEC2019   .           G12W    2       0           0
01JAN2020   01JAN2020   G12W    2       0           0
01FEB2020   01JAN2020   G12W    2       1           1
01MAR2020   01JAN2020   G12W    2       0           1
01APR2020   01JAN2020   G12W    2       0           1

【问题讨论】:

  • 您指的是代码中名为 start_podwyzka 的列,但您的示例数据中有一个名为 start 的列。请提供此额外列或更正您的代码。
  • 另外,您的示例数据中有group,但代码中有GRUPA_TARYFOWA
  • 我删除了我的代码。完全错了。
  • 请包括您尝试过的内容,即使它是错误的。本网站的目标是帮助您修复它,而不是为您编写它..
  • 我准备代码:数据需要;设置有;如果开始 ne '.'然后做;通过 GROUP GR_ROZL NOTSORTED;保留 NEED_TO 0;如果 FIRST.GROUP 那么 NEET_TO = 0; IF not NEED_TO AND START ge DATA THEN NEED_TO = 1;结尾;否则 NEED_TO = MTH_SATTL;运行;

标签: sas retain 4gl


【解决方案1】:

规则“填写 1 直到下一个 GROUP 和 GR_ROZL”表示您将希望通过处理获得。如果BY 组是连续的但未整理,您将需要NOTSORTED 选项。您还需要一个 RETAINed 变量,该变量在组开始时重置并根据您的逻辑有条件地分配。

例子:

data want;
  set have;
  by group gr_rozl NOTSORTED;

  retain need_to 0;

  * reset at the start of group;
  if first.gr_rozl then need_to = 0;

  * assign need_to if it is unassigned and meets assignment criteria;
  * this ensures the assigned value is carried forward (via retain) until reset again;
  if not need_to and start < data then need_to = 1;

  * alternate way to assign using logic operator OR;
  * need_to = need_to OR (start < data);
run;

要在第一次出现start &lt; data 之后在后续行上设置need_to 值,您可以使用额外的保留变量作为逻辑标志。

例子:

data have; input
Date        Start       Group $   GR_ROZL MTH_SATTL; 
attrib date start informat=date9. format=date9.;datalines;
01OCT2019   .           G11     2       0          
01NOV2019   .           G11     2       0          
01DEC2019   .           G11     2       0          
01JAN2020   01JAN2020   G11     2       0          
01FEB2020   01JAN2020   G11     2       1          
01MAR2020   01JAN2020   G11     2       0          
01APR2020   01JAN2020   G11     2       0          
01OCT2019   .           G11     3       0          
01NOV2019   .           G11     3       0          
01DEC2019   .           G11     3       0          
01JAN2020   01JAN2020   G11     3       0          
01FEB2020   01JAN2020   G11     3       0          
01MAR2020   01JAN2020   G11     3       1          
01APR2020   01JAN2020   G11     3       0          
01OCT2019   .           G12W    2       0          
01NOV2019   .           G12W    2       0          
01DEC2019   .           G12W    2       0          
01JAN2020   01JAN2020   G12W    2       0          
01FEB2020   01JAN2020   G12W    2       1          
01MAR2020   01JAN2020   G12W    2       0          
01APR2020   01JAN2020   G12W    2       0          
run;

data want;
  set have;
  by group gr_rozl NOTSORTED;

  retain need_to need_to_flag 0;

  * reset at the start of group;
  if first.gr_rozl then do; need_to = 0; need_to_flag = 0; end;

  * set retained value for fill in;
  if not need_to and need_to_flag then need_to = 1;

  * set flag for setting retained value on subsequent rows;
  if mth_sattl and not need_to_flag and start < date then need_to_flag = 1;

  drop need_to_flag;
run;

【讨论】:

  • 非常感谢您的快速回答,但我在描述时犯了错误。在您的代码中,我收到的示例是 NEED_TO 列上的第 4 行“1”。我应该收到“0”,应该从第 5 行收到“1”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多