我有一个.xls文件的列名(使用excelcs引擎进行导入),它是动态的,每天都在变化。
我想知道如何在sas中进行引用和重命名动态列名,而不知道它将被称为什么?
答案 0 :(得分:3)
这取决于动态变化的方式。如果它完全不可预测 - 您无法编写代码来消除它,或者消除其他已知列 - 您最简单的选择可能是使用GETNAMES=NO
,然后自己设置名称。
如果它在某种程度上是可预测的(例如它是" MYDYNAMIC_XXXX"其中XXXX以某种方式改变),你可以从dictionary.columns
中找出它。 (根据需要修改libname / memname / etc.; memname
是数据集名称。)
proc sql;
select name into :dynname
from dictionary.columns
where libname='WORK' and memname='MYDATASET'
and name like 'MYDYNAMIC_%';
quit;
或者,如果您需要知道,可以使用NOT(IN(...))
子句来消除已知的列名。
最后,如果它位于一个一致的位置,则比使用GETNAMES=NO
更容易根据变量号(where varnum=5
查询dictionary.columns,例如,如果它是第五个变量号)。
答案 1 :(得分:2)
扩展Joe的最后评论 - 该列是否处于相同位置,只是称为不同的东西?
如果是这样,您可以使用dictionary.columns
表,选择特定的列号,并将相应的列名存储在宏变量中。
例如,您的列是Excel / dataset中的第5列...
/* Pull column name */ proc sql ; select name into :DYNVAR from dictionary.columns where libname = 'SASHELP' and memname = 'CLASS' and varnum = 5 ; quit ; /* Then to reference the column simply substitute it for &DYNVAR */ data want ; set sashelp.class (keep=&DYNVAR) ; run ;
如果需要,您可以将其扩展到多个列......
/* Pull column name */ proc sql ; select name into :DYNVARS separated by ' ' from dictionary.columns where libname = 'SASHELP' and memname = 'CLASS' and varnum in (1,4,5) ; quit ; /* Then to reference the columns simply substitute it for &DYNVARS */ data want ; set sashelp.class (keep=&DYNVARS) ; run ;