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 ;
真漂亮。谢谢真漂亮。谢谢