Преобразование данных с использованием proc транспонирования имен статических столбцов приводит к дублированию записей.

У меня есть следующая структура данных, которую мне нужно преобразовать:

Я работал над правильным переносом данных, чтобы получить структуру таблицы.

Целевая структура

Attribute 1, Attribute 2, ...., Attribute n

Outcome1-A, Outcome2-A, ...., Outcome n-A .....

....

Outcome A-Z, Outcome2-Z, ...., Outcome n-Z .....

Я начал со следующего утверждения, модификации были бы замечательными. Статические имена атрибутов импортируются как повторяющиеся записи.

    PROC TRANSPOSE DATA=INPUT_TAB OUT=vertikal ;
    VAR v  name ;
    id n;
    RUN;

person Kingsley10    schedule 01.07.2020    source источник
comment
Вы хотите использовать значение NAME в качестве имен новых переменных? Любое из значений длиннее 32 байт? Если это так, вам нужно будет создать новую переменную с более коротким значением, которое вы могли бы использовать в качестве имени для новых переменных.   -  person Tom    schedule 01.07.2020


Ответы (2)


Оператор id сообщает SAS, какую переменную использовать для имен столбцов, и, если я правильно понимаю ваш вопрос, это Name, а не n. Следовательно, Name не должно быть в списке VAR

Вы также должны указать SAS, когда начинать новое наблюдение (или строку), используя оператор by. Вероятно, один из столбцов слева от Name является хорошим кандидатом. Назовем его group_id. Следовательно, код должен выглядеть так:

PROC TRANSPOSE DATA=INPUT_TAB OUT=vertikal ;
   by group_id;
   VAR v;
   id Name;
RUN;

Если такой переменной, как group_id, нет, вы можете создать ее следующим образом:

DATA INPUT_VIEW / view=INPUT_VIEW;
   set INPUT_TAB;
   retain group_id 1;
   if Name eq "SZENARIO_ID" then group_id = group_id + 1;

PROC TRANSPOSE DATA=INPUT_VIEW OUT=vertikal ;
   by group_id;
   VAR v;
   id Name;
RUN;

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

person Dirk Horsten    schedule 01.07.2020

Я расширил таблицу с помощью COL_TYP, однако команда транспонирования не работает, см. сообщение об ошибке

PROC SQL; 
  CREATE TABLE TEST_CASE_WHEN AS 
  SELECT A.*,
         CASE WHEN A.NAME IN ('SZENARIO_ID') THEN 1
         ELSE 0 END AS COL_TYP
  FROM   WORK.TEST A
 ;
QUIT;


proc sort 
data = work.INPUT_VIEW out= input_view2;
BY N;
RUN; 



PROC TRANSPOSE DATA=INPUT_VIEW2 OUT=vertikal ;
   by COL_TYP;
   VAR v;
   id Name;
RUN;

ОШИБКА: набор данных WORK.INPUT_VIEW2 не отсортирован по возрастанию. Текущая группа BY имеет COL_TYP = 2, а следующая группа BY имеет COL_TYP = 0.

Спасибо и с уважением Кингсли

person Kingsley10    schedule 02.07.2020
comment
Ошибка довольно ясна. Вы сказали SAS, что данные были отсортированы по COL_TYP, а это не так. Измените оператор BY на шаге сортировки, чтобы он соответствовал оператору BY на шаге транспонирования. Пожалуйста, обновите свой вопрос, указав фактические образцы данных, которые воспроизводят проблему. Не фотографии данных, реальный текст. - person Tom; 02.07.2020