У меня есть набор данных с диагностическими записями, где у пациента может быть одна или несколько записей даже для одного и того же кода. Я не могу использовать группу по переменной «код», так как она показывает ошибку, аналогичную значению идентификатора «code_v58» дважды в одной и той же группе BY.
data have;
input id rand found code $;
datalines;
1 101 1 001
2 102 1 v58
2 103 0 v58 /* second diagnosis record for patient 2 */
3 104 1 v58
4 105 1 003
4 106 1 003 /* second diagnosis record for patient 4 */
5 107 0 v58
;
Desired output:
Obs id code_001 code_v58 code_003
1 1 1 . .
2 2 . 1 . /* second diagnosis code's {v58} status for patient 2 is 1, so it has to be taken*/
3 3 . 1 .
4 4 . . 1
5 5 . 0 .
Когда я попытался с оператором let вроде [this],
proc transpose data=temp out=want(drop=_name_) prefix=code_ let;
by id;
id code; * column name becomes <prefix><code>;
var found;
run;
Я получил вывод, как показано ниже:
Obs id code_001 code_v58 code_003
1 1 1 . .
2 2 . 0 .
3 3 . 1 .
4 4 . . 1
5 5 . 0 .
Я попробовал это и изменил PROC TRANSPOSE, чтобы использовать идентификатор и подсчет в выражении BY.
proc transpose data=temp out=want(drop=_name_) prefix=code_;
by id count;
id code; * column name becomes <prefix><code>;
var found;
run;
И получил результат, как показано ниже:
Obs id count code_001 code_v58 code_003
1 1 1 1 . .
2 2 1 . 1 .
3 2 2 . 0 .
4 3 1 . 1 .
5 4 1 . . 1
6 4 2 . . 1
7 5 1 . 0 .
Могу ли я узнать, как удалить повторяющиеся идентификаторы пациентов и обновить код до 1, если он обнаружен в каких-либо записях?
Какое найденное значение (0/1) следует выбрать для перестановки, если у вас есть повторяющиеся коды и разные найденные флаги? Первый, последний или 1-й?
@Reeza Если есть дубликаты, мне нужно сохранить только наличие этого кода, т.е. только для found=1
@Richard Мне нужно выбрать только found=1. То есть мне нужно получить код диагностики = 1 только один раз, когда у пациента есть история этого конкретного кода. Итак, сначала найдено =1.
Мне кажется, что вы хотите что-то вроде этого - сначала предварительно обработайте данные, чтобы получить значение, которое вы хотите для FOUND, затем транспонируйте (если вам это действительно нужно). TABULATE делает то, что вы хотите сделать для FOUND (берете максимальное значение, 1, если присутствует, 0, если присутствуют только 0, в противном случае отсутствует), а затем TRANSPOSE, что так же, как вы делали раньше.
proc tabulate data=have out=tab;
class id code;
var found;
tables id,code*found*max;
run;
proc transpose data=tab out=want prefix=code_;
by id;
id code;
var found_max;
run;
Это сработало для меня. Но у меня более 8 лакхов записей. Так что работает медленно. Большое спасибо за ваши усилия. Я узнал кое-что новое, используя tabulate proc...
Вы можете transpose групповой агрегат view.
proc sql;
create view have_v as
select id, code, max(found) as found
from have
group by id, code
order by id, code
;
proc transpose data=have_v out=want prefix=code_;
by id;
id code;
var found;
run;
Напишите Proc STDIZE (спасибо @Reeza), если хотите заменить отсутствующие значения (.) на 0
proc stdize data=want out=want missing=0 reponly;
var code_:;
run;
Я предпочитаю этот ответ. Он работает быстро, так как у меня более 8 лакхов записей... Спасибо..!!
Что вы хотите получить на выходе, когда у вас есть дубликаты? Удаляет ли правильный ответ или в этом столбце должно быть 2 или они должны повторяться (например, code_v58_1 code_v58_2). Если вы просто хотите удалить их, используйте PROC SORT с NODUPKEY, чтобы удалить любые дубликаты по мере необходимости.