对列名排序后转置和添加前缀的宏

Posted

技术标签:

【中文标题】对列名排序后转置和添加前缀的宏【英文标题】:macro to transpose and add a prefix after ordering columns' names 【发布时间】:2014-09-03 02:18:56 【问题描述】:

我需要运行一个宏,它对许多变量进行转置(并为每个变量创建一个表),对列名称进行排序,这些名称是数字的,但还要添加变量名称作为前缀(这是一个字符串) .

我在 SAS 中有一个宏来执行转置,其中包含不同的变量作为转置中的 var。代码是:

%macro transponer(var);
proc transpose data=labo2.A_svm_200711_200806
out=labo2.D_tr_&var.0;
var &var;
id mes;
by cid;
run;

/*......more code.....*/

select cats(name, '=', &var, name)
into :prefijolista
separated by ' '
from dictionary.columns 
where libname='LABO2' and memname= cats('D_TR_',upcase(&var))
and name like '_20%';
quit;
%put &prefijolista;
%mend;

由于 mes 是数字,我想对变量进行排序,这就是为什么我没有在 proc 转置中引入“prefix &var”,而是在保留之后这样做(这对列排序很有用)。

当我尝试引入前缀(在排序之后)时,问题就开始了。

由于其中一个变量的名称是例如“monto”,我收到以下错误(因为它是转置中的 var 变量,而不是转置表中的列名):

在贡献表中未找到以下列: 蒙托。

我的下一步是:

proc datasets library=labo2;
modify D_tr_&var.0;
rename &prefijolista;
quit;

但是在完成上一个之前我不能这样做。

所以我不知道如何在转置后对列进行排序并添加前缀。

我该如何解决这个问题?

谢谢!

【问题讨论】:

我认为问题是因为变量 &var 得到“monto”,而“monto”既不是列也不是常数。但又不知道如何解决它。 【参考方案1】:

您需要使用 PROC DATASETS 之类的名称重命名列。

proc datasets lib=work nolist;
modify myDataSet;
rename old_col_name = new_col_name;
run;
quit;

PROC DATASETS. 的文档下的 Base SAS 指南中提供了一个文档示例,可在线获取:http://support.sas.com/documentation/cdl/en/proc/67327/html/default/viewer.htm#n0mfav25learpan1lerk79jsp30n.htm

【讨论】:

这将是下一步,但我想用一个列表来做(因为有很多变量)。 好的。您需要在问题中提供更多背景信息。目前尚不清楚这是您尝试过的。显示该代码和日志中的错误。【参考方案2】:

问题是宏内部的cats函数中的&var必须使用

" "

你也可以使用

sysfunc(cats(D_TR, &a)

所以最后代码仍然是这样的:

%let a = %upcase(&var);
%put &a;
%let b=%sysfunc(cats(D_TR_,&a));
%put &b;

proc sql;
select cats(name, '=', "&var" , name)
into :prefijolista
separated by ' '
from dictionary.columns 
where libname='LABO2' and memname= "&b"
and name like '_20%';
quit;
%put &prefijolista;
%put "&b";


PROC datasets library=LABO2;
modify &b;
rename &prefijolista;
quit;
%put "ult" &b;

不是很简单,但很有效。 :)

【讨论】:

以上是关于对列名排序后转置和添加前缀的宏的主要内容,如果未能解决你的问题,请参考以下文章

SQL转置和添加列

c++矩阵的转置和快速转置

如何从包含集合的 pandas 列转置和转换为“one-hot-encode”样式?

循环转置和连接数据帧列表

Spark:如何使用嵌套数组转置和分解列

matlab中转置与共轭转置的问题