写一个SAS方程,即使缺少更优雅的值

写一个SAS方程,即使缺少更优雅的值,sas,missing-data,Sas,Missing Data,我有一个数据集,在那里我把事情转换成分钟。看起来是这样的: id hours minutes 1 1 5 2 . 45 3 1 . 等 我想将所有内容转换为分钟,所以我写了以下内容: DATA TEST; SET Original; in_minutes = 60*hours + minutes; RUN; 现在我知道,对于缺少的值,它将返回,但我希

我有一个数据集,在那里我把事情转换成分钟。看起来是这样的:

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

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

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;

但是如果你用更多的片段来做一个等式,这看起来可能会很复杂。如果不是像
sum
avg
,有没有更优雅的方法来处理等式中的缺失

我使用的是
sum()
函数允许丢失:

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

x = .;
x = sum(x,0)  => x=0
因此,请尝试:

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

我使用的是
sum()
函数允许丢失:

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

x = .;
x = sum(x,0)  => x=0
因此,请尝试:

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

我将转换为SAS时间(秒),并使用合并功能为例

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;

我将转换为SAS时间(秒),例如使用合并功能

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;

即使缺少一些值,也可以使用
SUM()
函数执行加法

in_minutes = sum(60*hours,minutes);
如果同时缺少小时和分钟,您仍然会得到一个缺少的值

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

in_minutes = sum(60*sum(hours,0),minutes);
但这意味着,如果两者都缺失,则将得到0而不是缺失。您可以添加更多逻辑以仅在至少存在一个值时执行计算

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

即使缺少一些值,也可以使用
SUM()
函数执行加法

in_minutes = sum(60*hours,minutes);
如果同时缺少小时和分钟,您仍然会得到一个缺少的值

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

in_minutes = sum(60*sum(hours,0),minutes);
但这意味着,如果两者都缺失,则将得到0而不是缺失。您可以添加更多逻辑以仅在至少存在一个值时执行计算

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

哦,我喜欢!这很聪明。如果必须包含0,它的工作原理更像coalesce()而不是sum()函数。哦,我喜欢这样!这很聪明。如果必须包含0,它的工作原理更像coalesce(),而不是sum()函数。第一个函数是否仍会向日志生成有关缺少值的消息?当然,它会生成消息,但它不会生成实际缺少值,除非缺少小时和分钟,与
+
运算符不同。第一个运算符是否仍会向日志生成有关缺失值的消息?当然,它会生成消息,但与
+
运算符不同,它不会生成实际缺失值,除非小时和分钟都缺失。