有人能解决这个问题吗?
data want;
set have;
by mac;
if first.mac then do; DayDif=0; KmDif=0; end;
else do;
DayDif = Date - lag(Date); /* calculate the difference between two dates */
KmDiff = Kms - lag(Kms);
end;
run;我得到的结果是(0在第一行,但是。(第二):
Mac Date Kms DayDif KmDif
SP0001 10DEC07 1885462.00000 0 0
SP0001 12DEC07 1885462.00000 . .
SP0001 30APR09 1885462.00000 505 0
SP0001 15JUL09 1886577.00000 76 1115
SP0001 16JUL09 1887667.00000 1 1090
SP0001 17JUL09 1889181.00000 1 1514
SP0001 17JUL09 1888825.00000 0 -356
.
. (当机器改变时,滞后被认为是t- (t-2)而不是t- (t-1) )为什么?代码有问题吗??
Machine Date Kms DayDif KmDif
SP0001 01OCT14 2898108.00000 1 1059
SP0001 02OCT14 2899148.00000 1 1040
HP0001 03OCT14 2900334.00000 1 1186
HP0002 17JAN08 926384.00000 0 0
HP0002 18JAN08 926384.00000 -2450 -1973950
HP0002 28APR09 1237332.00000 466 310948
HP0002 29APR09 1238599.00000 1 1267发布于 2016-11-08 11:21:16
我能这样做..。
data want;
set have;
by mac;
RETAIN lag_date lag_kms;
DROP lag_date lag_kms;
if first.Mac
then do;
DayDif=0;
KmDif=0;
end;
else do;
DayDif = abs(Date - lag_date);
KmDif = abs(Kms - lag_kms);
end;
lag_date = Date;
lag_kms = Kms;
run;这给了我我想要的结果..。
Mac Date Kms DayDif KmDif
SP0001 10DEC07 1885462.00000 0 0
SP0001 12DEC07 1885462.00000 2 0
SP0001 30APR09 1885462.00000 505 0
SP0001 15JUL09 1886577.00000 76 1115
SP0001 16JUL09 1887667.00000 1 1090
SP0001 17JUL09 1888825.00000 1 1158
SP0001 17JUL09 1889181.00000 0 356但现在我还要做一件事..。总计= 1158 + 356 ( 17JUL09 ),等等。即,添加一个列,其中我们将按日期对累积和值进行分组。
有什么建议吗?
发布于 2016-11-08 11:05:27
lag()函数的值不是从以前的观察中提取的(一个常见的误解)。每次执行函数时,它们都存储在内存中(请参阅文档)。
在您的示例中,当机器发生变化时,由于条件逻辑(if first.mac then do / else)而没有执行延迟函数,因此"t-2“值只是上一次迭代的结果。尝试以下几点:
data want;
set have;
by mac;
if first.mac then do;
DayDif=lag(Date); /* executing the lag for subsequent iteration */
DayDif=0;
KmDif=0;
end;
else do;
DayDif = Date - lag(Date); /* calculate the difference between two dates */
KmDiff = Kms - lag(Kms);
end;
run;https://stackoverflow.com/questions/40485127
复制相似问题