Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sas 基于第一行中的值重命名列_Sas - Fatal编程技术网

Sas 基于第一行中的值重命名列

Sas 基于第一行中的值重命名列,sas,Sas,我有这样一个数据集: DATA HAVE; INPUT A $ B $ C $ D $ ; DATALINES; VAR1 VAR2 VAR3 VAR4 cat dog cat dog dog cat cat dog dog cat cat cat ; RUN; 我想将该数据集转换为如下所示: DATA WANT; INPUT VAR1 $ VAR2 $ VAR3 $ VAR4 $ ; DATALINES; cat dog cat dog dog cat cat d

我有这样一个数据集:

DATA HAVE;
   INPUT A $ B $ C $ D $  ;
   DATALINES;
VAR1 VAR2 VAR3 VAR4
cat dog cat dog
dog cat cat dog
dog cat cat cat
;
RUN;
我想将该数据集转换为如下所示:

DATA WANT;
   INPUT VAR1 $ VAR2 $ VAR3 $ VAR4 $  ;
   DATALINES;
cat dog cat dog
dog cat cat dog
dog cat cat cat
;
RUN;
是否有一个功能我可以申请完成这一点?基本上,我希望将列重命名为第1行中相应的值,并删除第1行


为了给这个奇怪的请求提供一点上下文,我导入了一个格式笨拙的xls

使用第一行中的值生成一组旧=新值,您可以在RENAME语句或RENAME=选项中使用这些值

proc transpose data=have(obs=1) out=names ;
  var _all_;
run;
如果列表足够短,可以使用单个宏变量来完成

proc sql noprint ;
  select catx('=',_name_,col1) 
    into :rename separated by ' '
    from names
  ;
quit;
data want ;
  set have (firstobs=2 rename=(&rename));
run;
然后可以使用宏变量

proc sql noprint ;
  select catx('=',_name_,col1) 
    into :rename separated by ' '
    from names
  ;
quit;
data want ;
  set have (firstobs=2 rename=(&rename));
run;

使用第一行中的值生成一组旧=新值,您可以在RENAME语句或RENAME=选项中使用这些值

proc transpose data=have(obs=1) out=names ;
  var _all_;
run;
如果列表足够短,可以使用单个宏变量来完成

proc sql noprint ;
  select catx('=',_name_,col1) 
    into :rename separated by ' '
    from names
  ;
quit;
data want ;
  set have (firstobs=2 rename=(&rename));
run;
然后可以使用宏变量

proc sql noprint ;
  select catx('=',_name_,col1) 
    into :rename separated by ' '
    from names
  ;
quit;
data want ;
  set have (firstobs=2 rename=(&rename));
run;

如果使用
proc transpose
且第一行的任何值的长度超过32个字符,则在
重命名
中使用时,它们将是无效的变量名

因此,
proc transpose
的替代方法是使用数组和数组函数来构建重命名列表

data cols ; set have (obs=1) ; array vars{*} $32. _CHARACTER_ ; do nvar = 1 to dim(vars) ; curr_varname = vname(vars{nvar}) ; /* get the current variable name, e.g. A B etc */ new_varname = vars{nvar} ; /* variable value, e.g. VAR1 VAR2 etc */ output ; end ; run ;
如果使用
proc transpose
且第一行的任何值的长度超过32个字符,则在
重命名
中使用时,它们将是无效的变量名

因此,
proc transpose
的替代方法是使用数组和数组函数来构建重命名列表

data cols ; set have (obs=1) ; array vars{*} $32. _CHARACTER_ ; do nvar = 1 to dim(vars) ; curr_varname = vname(vars{nvar}) ; /* get the current variable name, e.g. A B etc */ new_varname = vars{nvar} ; /* variable value, e.g. VAR1 VAR2 etc */ output ; end ; run ;
真漂亮。谢谢真漂亮。谢谢