即使价值缺失得更优雅,也要写一个SAS方程式

时间:2016-04-11 18:34:31

标签: sas missing-data

我有一个数据集,我将事物转换为分钟。它看起来像这样:

  id      hours     minutes
  1        1           5
  2         .          45
  3         1          .

ETC

我想将所有内容转换为分钟,所以我写了这个:

DATA TEST;
  SET Original;
  in_minutes = 60*hours + minutes;
RUN;

现在我知道,对于缺失值,这将返回.,但我希望它返回正确的值,例如1将是65,id 2将是45,而id 3将是60.

我想我可以写:

DATA TEST;
  SET Original
  IF hours ^= . AND Minutes ^= . then in_minutes = 60*hours + minutes;
  ELSE IF hours ^= . THEN in_minutes = 60*hours;
  ELSE if minutes ^= . THEN in_minutes = minutes;
RUN;

但是,如果你用更多的碎片做一个等式,这似乎很复杂。如果它不是sumavg,那么是否有更优雅的方法来处理方程式的缺失?

3 个答案:

答案 0 :(得分:4)

我会转换为SAS TIME(秒)并使用合并功能。

data time;
   input hours     minutes;
   duration = hms(coalesce(hours,0),coalesce(minutes,0),0);
   format duration hhmm8.;
   cards;
1 5
. 45
1  .
46 20
. 200
;;;;
   run;

enter image description here

答案 1 :(得分:2)

我使用sum()函数容忍丢失的事实:

x = sum(.,1)  => x=1

x = .;
x = sum(x,0)  => x=0

所以试试:

in_minutes = 60*sum(0,hours) + sum(0,minutes);

答案 2 :(得分:1)

即使有一些缺失值,您也可以使用SUM()函数执行添加。

in_minutes = sum(60*hours,minutes);

如果缺少HOURS和MINUTES,您仍会得到缺失值。

您可以添加另一个SUM()函数调用(或COALESCE()函数调用)以消除在HOURS丢失时生成缺失值的警告。

in_minutes = sum(60*sum(hours,0),minutes);

但这意味着如果两者都缺失,你将获得0而不是失踪。您可以添加更多逻辑,以便在至少存在其中一个值时执行计算。

if n(hours,minutes) then in_minutes = sum(60*sum(hours,0),minutes);