#sas
Вопрос:
Я пытаюсь свернуть несколько строк двоичных переменных в одну строку для каждого идентификатора пациента, как показано на моей иллюстрации. Не мог бы кто-нибудь, пожалуйста, помочь мне с кодом SAS для этого? Спасибо
Комментарии:
1. Каково правило для коллапса?
2. По идентификатору пациента, так что, если вы можете видеть на картинке, мне нужна только одна строка на идентификатор пациента, поэтому переменные 2018, 2019 и 2020 являются причиной того, что сейчас на человека приходится несколько строк, но мне просто нужно собрать их в одну строку, где мы можем видеть по 1 строке на человека, если идентификатор присутствовал в 2018, 2019 и 2020 годах.
3. Не публикуйте данные в виде изображений, пожалуйста, публикуйте в виде текста. Изображения означают, что нам потребуется ввести ваши данные для тестирования любых решений.
4. Итак, вы хотите 1, только если ВСЕ значения равны одному? Или вы хотите 1, если ЛЮБОЕ из значений равно единице?
5. Почему в заголовках столбцов указаны номера, а не имена переменных?
Ответ №1:
Если правило состоит в том, чтобы установить его равным 1, если оно когда-либо равно 1, то возьмите МАКСИМАЛЬНОЕ значение. Если правило состоит в том, чтобы установить его равным одному, только если все они являются одним целым, то возьмите МИНИМАЛЬНОЕ значение.
proc summary data=have nway ;
by id;
output out=want max= ;
run;
Комментарии:
1. Отлично, я думаю, что на этот раз это сработало. Огромное спасибо.
2. Вам понадобится оператор VAR или MAX(список переменных)=; PROC ОЗНАЧАЕТ, что по умолчанию будут использоваться все числовые переменные, не упомянутые в других операторах.
Ответ №2:
Трюк с обновлением
data want;
update have(obs=0) have;
by id;
run;
Или
proc sql;
create table want as
select ID, max('2018'n) as Y2018, max('2019'n) as Y2019, max('2020'n) as Y2020
from have
group by ID
order by ID;
quit;
Непроверенные, поскольку вы предоставили данные в виде изображений, пожалуйста, опубликуйте их в виде текста, предпочтительно в качестве шага ввода данных.
Комментарии:
1. Обновление не будет работать для этого, если бы нули отсутствовали, это могло бы сработать. Я бы использовал СВОДКУ PROC по SQL гораздо меньше, чем ввод текста.
2. Да, вообще-то, я думаю, что заговорил слишком рано. Это сохранило только одну строку, в то время как я хочу, чтобы все строки на идентификатор пациента были свернуты в 1 строку. Я выдумал эти данные, вот почему это просто картинка
3. Согласитесь с резюме процесса, за исключением таких имен переменных, как это, вам все равно придется перечислять их вручную, поэтому выигрыш невелик. Зависит от фактической структуры данных.
4. @Sophia Даже копирование и вставка необработанных данных Excel лучше, чем изображений, на этот счет есть множество рекомендаций, а не только мои личные предпочтения.
Ответ №3:
Вот пошаговое решение на основе данных. Конечно, более сложные, чем приведенные выше ответы, но они показывают способы использования массивов, first.
last.
обработки и retain
оператора.
Используйте сохраненный временный массив для хранения значений 2018
— 2020
до последнего наблюдения каждой id
группы. При последнем значении каждого id
из них проверьте , равно ли каждому удерживаемому значению 1, и установите для каждого значения года значение 1 или 0.
data want;
set have;
by id;
array year[3] '2018'n--'2020'n;
array hold[3] _TEMPORARY_;
retain hold;
if(first.id) then call missing(of hold[*]);
do i = 1 to dim(year);
if(year[i] = 1) then hold[i] = 1;
end;
if(last.id) then do;
do i = 1 to dim(year);
year[i] = (hold[i] = 1);
end;
output;
end;
drop i;
run;