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

如何使SAS数据集的第一行成为变量名?,sas,rename,Sas,Rename,我有一个已经导入的数据集,其中第一行包含变量名。我知道,通常在导入数据集时使用getnames=yes。但是,如果已经导入数据,如何使用数据步骤使第一行成为变量名 数据如下所示: A B C 1 Name 1 Name 2 Name 3 2 2 4 66 3 3 5 6 已经导入的数据的问题是,所有数字数据可能都放在字符变量中,因

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

数据如下所示:

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

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

无论如何,您将需要为每个必须重命名的变量构造重命名对old name=new name。第1行中的新名称可以
转置该行以将这些名称部分作为数据进行排列。SQL with
:into
之间用
分隔可以填充宏变量,以便在执行列重命名而不重写整个数据集的
过程中使用。最后,使用
modify
的数据步骤可以
再次在不重写整个数据集的情况下删除一行

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;

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

无论如何,您将需要为每个必须重命名的变量构造重命名对old name=new name。第1行中的新名称可以
转置该行以将这些名称部分作为数据进行排列。SQL with
:into
之间用
分隔可以填充宏变量,以便在执行列重命名而不重写整个数据集的
过程中使用。最后,使用
modify
的数据步骤可以
再次在不重写整个数据集的情况下删除一行

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;

由于将名称作为数据读取可能会使所有变量都具有字符特性,因此可以尝试将数据转置两次以修复它。这对于小型数据集来说非常有效

因此,第一个转置将把当前名称放入
\u name\u
变量中,并将每一行转换为一列。第二个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;

由于将名称作为数据读取可能会使所有变量都具有字符特性,因此可以尝试将数据转置两次以修复它。这对于小型数据集来说非常有效

因此,第一个转置将把当前名称放入
\u name\u
变量中,并将每一行转换为一列。第二个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;

如果变量是数字,则必须将其转换为字符。你确定吗?目的是什么?这是一个坏主意,考虑添加标签吗?如果你试图导出一个带有标签和变量名的文件,在两个单独的行中,这里有一个方法:如果变量是数字的,它就必须被转换成字符。你确定吗?目的是什么?这是个坏主意,考虑添加标签吗?如果你试图导出一个标签和变量名的文件,在两个单独的行中,这里有一个方法: