Почему мой оператор массива SAS не ссылается на ожидаемые переменные?

Я пытаюсь найти количество часов между отправлением (выездом) и следующим визитом (входом) в SAS.

Мой набор данных (набор данных SAS) выглядит так. Переменные In и Out являются переменными даты и времени.

ID  In1             In2             Out1            Out2
-----------------------------------------------------------------
1   14AUG12:10:27   16AUG12:08:38   14AUG12:16:25   16AUG12:09:38
2   08AUG12:14:41   09AUG12:07:37   08AUG12:22:14   09AUG12:08:58
3   08AUG12:08:54   09AUG12:23:45   08AUG12:14:04   10AUG12:02:55
4   27AUG12:06:41   27AUG12:10:42   27AUG12:09:45   27AUG12:12:17
5   07AUG12:23:16   09AUG12:22:13   07AUG12:23:16   10AUG12:15:59

Я хочу рассчитать разницу между In2 и Out1, то есть я хочу In2 - Out1 в часах (разница между тем, когда они вышли, и когда они снова вернулись). Я решил сделать это по циклу, так как у меня много записей. Я варьировал входы и выходы для всех записей (я не знаю этого заранее). В этом конкретном наборе данных у меня есть до In33 и Out33.

Мой код

data counts;

set mydata;

array in _numeric_;

array out _numeric_;

do k = 1 to 32;

time = intck('hour', out[k], in[k+1]);

if time >= 0 and time<= 72 then output;

end;
run;    

Моя проблема здесь заключается в точности количества часов, которые я получаю в качестве вывода. Для этих конкретных данных, показанных выше, я получаю время 46, 17, 39, 4 и 52 часа соответственно для ID 1, 2, 3, 4 и 5. Но время должно быть 40, 9, 33, 1 и 47 часов. соответственно для ID 1, 2, 3, 4 и 5. Я не уверен, что я здесь делаю неправильно. Я буду признателен за вашу помощь.


person Kany    schedule 27.04.2016    source источник
comment
Попробуйте определить массивы с соответствующими переменными. МАССИВ В:; МАССИВ ВЫХОД:;   -  person data _null_    schedule 28.04.2016
comment
Действительно ли ваш столбец идентификаторов находится в вашем наборе данных? Если идентификатор является числовым, он попадает в массив и выходит из массива? Если вы думаете, что вам не хватает идентификатора, потому что вы начинаете с k = 1, а не с k = 0, это не поможет, поскольку массивы SAS начинаются с 1.   -  person Snorex    schedule 28.04.2016
comment
IN и OUT — правильные имена переменных. ID находится в наборе данных. IN и OUT — исходные переменные, имеющие несколько записей для каждого идентификатора; Я переставил их, чтобы иметь только одну запись для каждого идентификатора, чтобы получить In1, In2 и т. д. Я заранее не знаю длину каждого массива, но и IN, и OUT всегда имеют одинаковую длину. Я попробую ваше предложение, найдя способ явно объявить массивы @Snorehorse   -  person Kany    schedule 28.04.2016


Ответы (2)


Ваши два массива идентичны, потому что вы объявляете их равными всем числовым переменным в вашем наборе mydata. Вы должны назвать их в соответствии с комментарием data_null_ или более явно:

array in in1-in33;
array out out1-out33;
person Snorex    schedule 28.04.2016

Я изменил массивы, и теперь я получаю требуемую точность. Вот как я это сделал

data counts;
set mydata;
array Ins {*} In: ;
array Outs {*} Out: ;
do k = 1 to dim(ins) - 1;
time = intck('hour', outs[k], ins[k+1]);
if time >= 0 and time <= 72 then output;
end;
run;

Спасибо за ваши предложения, это помогло.

person Kany    schedule 28.04.2016