Как я могу сделать первую строку набора данных SAS именами переменных? - PullRequest
0 голосов
/ 06 февраля 2019

У меня уже есть импортированный набор данных, где первая строка содержит имена переменных.Я знаю, что обычно при импорте набора данных вы используете getnames = yes.Однако, если данные уже импортированы, как я могу сделать в первой строке имена переменных, используя шаг данных?

Данные выглядят так:

         A         B         C 
1      Name 1   Name 2     Name 3
2        2        4          66
3        3        5          6

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

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

Таким образом, первая транспонирование поместит текущее имя в переменную _NAME_ и преобразует каждую строку в столбец.Второй метод transpose может удалить исходное имя и использовать первую строку (новая переменная COL1) в качестве имен.

proc transpose data=have out=wide ;
 var _all_;
run;

proc transpose data=wide(drop=_name_ rename=(col1=_name_)) out=want(drop=_name_ _label_);
   var col:;
   id _name_;
run;
0 голосов
/ 06 февраля 2019

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

В любом случае вам нужно будет создать пары переименования old-name = new-name для каждой переменной, которую необходимо переименовать.Новое имя в строке 1 позволяет transpose этой строке упорядочить эти части имени как данные.SQL с :into и separated by может заполнить макропеременную для использования на шаге proc datasets, который выполняет переименование столбца без перезаписи всего набора данных.Наконец, шаг DATA с modify может remove на месте, опять же, без перезаписи всего набора данных.

filename sandbox temp;

data _null_;
  file sandbox;
  put 'A,B,C';
  put 'Name 1, Name 2, Name 3';
  put '2,4,66';
  put '3,5,6';
run;

proc import datafile=sandbox dbms=csv replace out=work.oops;
run;

proc transpose data=oops(obs=1) out=renames;
var _all_;
run;           

proc sql noprint;
  select cats(_name_,"=",compress(col1,,"KN"))
  into :renames separated by ' '
  from renames;

%put NOTE: &=renames;

proc datasets nolist lib=work;
  modify oops;
  rename &renames;
run;

data oops;
  modify oops;
  remove;
  stop;
run;

%let syslast=oops;
...