我有一个已经导入的数据集,其中第一行包含变量名。我知道通常在导入数据集时使用getnames = yes。但是,如果已经导入了数据,如何使用数据步骤使第一行成为变量名?
数据如下:
A B C
1 Name 1 Name 2 Name 3
2 2 4 66
3 3 5 6
答案 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
可以在该行中将这些名称部分安排为数据。带有:into
和separated 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;