Транспонирование таблицы при сворачивании повторяющихся наблюдений для каждой группы BY

У меня есть набор данных с диагностическими записями, где у пациента может быть одна или несколько записей даже для одного и того же кода. Я не могу использовать группу по переменной «код», так как она показывает ошибку, аналогичную значению идентификатора «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, если он обнаружен в каких-либо записях?

Что вы хотите получить на выходе, когда у вас есть дубликаты? Удаляет ли правильный ответ или в этом столбце должно быть 2 или они должны повторяться (например, code_v58_1 code_v58_2). Если вы просто хотите удалить их, используйте PROC SORT с NODUPKEY, чтобы удалить любые дубликаты по мере необходимости.

Reeza 18.12.2020 18:51

Какое найденное значение (0/1) следует выбрать для перестановки, если у вас есть повторяющиеся коды и разные найденные флаги? Первый, последний или 1-й?

Richard 18.12.2020 20:20

@Reeza Если есть дубликаты, мне нужно сохранить только наличие этого кода, т.е. только для found=1

DOT 18.12.2020 22:19

@Richard Мне нужно выбрать только found=1. То есть мне нужно получить код диагностики = 1 только один раз, когда у пациента есть история этого конкретного кода. Итак, сначала найдено =1.

DOT 18.12.2020 22:22
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
4
376
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Мне кажется, что вы хотите что-то вроде этого - сначала предварительно обработайте данные, чтобы получить значение, которое вы хотите для 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...

DOT 22.12.2020 12:12
Ответ принят как подходящий

Вы можете 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 лакхов записей... Спасибо..!!

DOT 22.12.2020 12:10

Другие вопросы по теме