【问题标题】:SAS: do loop help: variable =1 from start of by group until marker =1SAS:做循环帮助:变量=1从组开始直到标记=1
【发布时间】:2014-06-18 15:43:38
【问题描述】:

在 SAS 中,我有按时间排序的数据。对于前 n 分钟,标记变量标记为 0,然后变为 1。这发生在“by”变量中。我想创建一个新变量,从“按”组观察开始到标记变量达到 1,每分钟 = 1。我尝试了数十种 do 循环组合,但均未成功。任何帮助将不胜感激!

【问题讨论】:

  • 您能否提供一个示例数据集...您希望它最终看起来像什么?
  • 肯定需要示例数据才能使这个问题成为一个好问题。

标签: sas do-loops


【解决方案1】:

来自这样的数据集:

by_var marker
A      0
A      0
A      1
B      0
B      0
B      1

你可以得到一个看起来像这样的数据集(如果每个观察都是一分钟):

by_var marker minute
A      0      1
A      0      2
A      1      3
B      0      1
B      0      2
B      1      3

通过按by_var 排序并使用简单的data 步骤从您的数据集中:

data my_data2;
  set my_data;
  by by_var;
  if first.by_var then minute = 0;
  minute+1;
  output;
run;

或者您是否需要更改类似的内容(使用时间变量):

by_var marker time
A      0      12:34:01
A      0      12:34:59
A      0      12:35:01
A      0      12:36:12
A      1      12:36:50
B      0      12:34:01
B      0      12:34:09
B      0      12:34:59
B      0      12:36:12
B      1      12:37:50

到这里:

by_var    marker      time         time2    minutes    Cumsum_minutes

  A          0      12:34:01           .       0           0
  A          0      12:34:59    12:34:01       0           0
  A          0      12:35:01    12:34:59       1           1
  A          0      12:36:12    12:35:01       1           2
  A          1      12:36:50    12:36:12       0           2
  B          0      12:34:01    12:36:50       0           0
  B          0      12:34:09    12:34:01       0           0
  B          0      12:34:59    12:34:09       0           0
  B          0      12:36:12    12:34:59       2           2
  B          1      12:37:50    12:36:12       1           3

代码:

data my_data;
  input by_var $ marker time time.;
  format time time.;
  cards;
  A 0 12:34:01
  A 0 12:34:59
  A 0 12:35:01
  A 0 12:36:12
  A 1 12:36:50
  B 0 12:34:01
  B 0 12:34:09
  B 0 12:34:59
  B 0 12:36:12
  B 1 12:37:50
  ;
run;

proc sort data=my_data;by by_var;run;

data final;
  set my_data;
  format time2 time.;
  by by_var;
  time2=lag(time);
  if first.by_var then do;
    minutes = 0;
    Cumsum_minutes = 0;
  end;
  else minutes=intck("minutes",time2,time);
  Cumsum_minutes+minutes;
run;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 2022-07-12
    • 2011-02-13
    • 2015-11-28
    • 2012-08-31
    相关资源
    最近更新 更多