如何使SAS数据集的第一行成为变量名?

时间:2019-02-06 15:57:20

标签: sas rename

我有一个已经导入的数据集,其中第一行包含变量名。我知道通常在导入数据集时使用getnames = yes。但是,如果已经导入了数据,如何使用数据步骤使第一行成为变量名?

数据如下:

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

2 个答案:

答案 0 :(得分:1)

由于将名称读取为数据可能会使您的所有变量成为字符,因此您可以尝试将数据转置两次以进行修复。这将适用于小型数据集。

因此,第一个转置会将当前名称放入_NAME_变量中,并将每一行转换为一列。第二个proc转置可以删除原始名称,并使用第一行(新的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;

答案 1 :(得分:0)

已经导入的数据的问题在于所有数字数据都可能放在字符变量中,因为导入过程看到的数据的“第一行”包含一些字符数据,并推动了自动列构造的推论。

无论如何,您将需要为每个必须重命名的变量构造重命名对 old-name = new-name 。第1行中的新名称使transpose可以在该行中将这些名称部分安排为数据。带有:intoseparated by的SQL可以填充用于proc datasets步骤的宏变量,该步骤执行列重命名而无需重写整个数据集。最后,使用modify的DATA步骤可以再次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;