Я хотел бы присвоить пустому полю значение, основанное на многих значениях других записей. Вот мой набор данных:
input ID date $10. type typea $10. ;
datalines;
1 10/11/2006 1 a
2 10/12/2006 2 a
2 . 2 b
3 20/01/2007 5 p
4 . 1 r
5 11/09/2008 1 ca
5 . 1 cb
5 . 2 b
;
run;
Моя цель следующая: для всех пустых записей переменной «дата» присвойте ей одну и ту же дату записи, которая имеет тот же идентификатор, тот же тип, но другой тип. Если других записей с описанными критериями нет, оставьте поле даты пустым. Итак, вывод должен быть:
data temp;
input ID date $10. type typea $10.;
datalines;
1 10/11/2006 1 a
2 10/12/2006 2 a
2 10/12/2006 2 b
3 20/01/2007 5 p
4 . 1 r
5 11/09/2008 1 ca
5 11/09/2008 1 cb
5 . 2 b
;
run;
Я пробовал что-то подобное на основе другого ответа на SO (SAS: получить первое значение, где условие проверяется группой), но это не работает:
by ID type typea ;
run;
data temp;
set temp;
by ID type typea ;
if cat(first.ID, first.type, first.typea) then date_store=date;
if cat(ID eq ID and type ne type and typea eq typea) then do;
date_change_type1to2=date_store;
end;
run;
У вас есть подсказки? Большое спасибо!
@Tom Я новичок в SAS, поэтому я просто знал, что для того, чтобы иметь условие if со многими переменными, мне нужно использовать функцию CAT()
.
Проверьте значение ПЕРВОГО. переменные. Чтобы найти первое наблюдение в группе, вам просто нужно проверить ПЕРВОЕ. переменная для последней переменной, указанной в операторе BY. В этом случае first.type
это то, что вам нужно. TYPEA НЕ является частью ваших группирующих переменных.
Что вы хотите сделать, если идентификатор имеет несколько датированных других типов для недатированного типа?
Вы можете использовать оператор UPDATE, чтобы помочь вам перенести значения DATE для группы.
data have;
input ID type typea :$10. date :yymmdd. ;
format date yymmdd10.;
datalines;
1 1 a 2006-11-10
2 2 a 2006-12-10
2 2 b .
3 5 p 2007-01-20
4 1 r .
5 1 ca 2008-09-11
5 1 cb .
5 2 b .
;
data want;
update have(obs=0) have;
by id type ;
output;
run;
Если также отсутствуют значения TYPEA, они также будут перенесены. Если вы не хотите, чтобы это произошло, вы можете перечитать только эти переменные после обновления.
data want;
update have(obs=0) have;
by id type ;
set have(keep=typea);
output;
run;
Почему вы создаете строку, используя функцию
CAT()
, а затем пытаетесь обработать ее как числовое значение, используя ее как условие в выраженииIF
?