我有一个非常简单的问题,可能有一个明显的答案,......但它一直在逃避我。也许有人可以提供帮助?
问题是这个......
我定义了一段时间,比如说
%let analysis = y_1005 -- y_1143;
其中y_1005定义了从2010年第5周到2011年第43周的一些变量。然后由此我定义了一个数组
array period(*) &analysis;
现在我想定义一个与第一个数组具有相同维度的第二个数组,我认为有一种聪明的方法可以做到这一点,例如
array new_array(dim(period));
但这显然不起作用。我尝试了各种各样的东西,但我无法让它发挥作用。如何在创建数组时调用“dim(period)”,或者以其他方式执行此操作?
答案 0 :(得分:5)
怎么样:
%let analysis = y_1005 - y_1143;
data test;
array period(*) &analysis;
call symput ("n_periods", dim(period));
run;
data test2;
array new_array(&n_periods.);
run;
(另见我对原帖的评论)
答案 1 :(得分:2)
我提出了一个解决方案,解决了@stevepastelan发现的问题,即超过52/53周的额外变量。如果将开始和结束周期存储在单独的宏变量中并使用WEEKU5。信息(例如2010年第5周的10W05),然后您可以使用DATA NULL 语句计算2个时段之间的周数,并创建要在数组中使用的变量名称的宏列表。我还使用PROC FORMAT为变量名称的年/周部分创建了所需的格式(即1005)。
希望这有帮助。
%let start=10W05;
%let end=11W43;
proc format;
picture yrwk low-high=%0y%0U (datatype=date);
run;
data _null_;
length varname $10 all_names $1000;
weeks=intck('week',input("&start.",weeku5.),input("&end.",weeku5.));
do i=0 to weeks;
varname=cats("y_",put(intnx('week',input("&start.",weeku5.),i),yrwk.));
call catx(' ',all_names,varname);
end;
call symput('weeks',weeks+1); /* start and end weeks are inclusive, so need to add 1 */
call symput('all_names',all_names);
run;
data x;
array period{*} &all_names.;
array new_array{&weeks.};
run;
答案 2 :(得分:0)