我有一个数据集,我将事物转换为分钟。它看起来像这样:
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;
但是,如果你用更多的碎片做一个等式,这似乎很复杂。如果它不是sum
或avg
,那么是否有更优雅的方法来处理方程式的缺失?
答案 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;
答案 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);