SAS - 参考多维阵列的一维

时间:2015-12-15 17:27:08

标签: arrays multidimensional-array sas

我有一个接受一维数组作为参数的宏。我想将它传递给2D数组的一个维度,但我无法弄清楚如何干净地引用2D数组的一个完整维度以产生新的一维数组。我确定有一些显而易见的东西,但我无法找到它。

下面是我编写的一些测试代码,用于尝试引用" myVals的一个维度。"

public:
static Selection^ Select(
    EditingContext^ context, 
    ModelItem^ itemToSelect
)

编辑TOM的评论 我希望能够创建一个命名数组newArray,根据数据步骤循环变量是1,2还是3,它将是别名:

  • 变量myval1_1 - myVal1_4或
  • 变量myVal2_1 - myVal2_4或
  • 变量myVal3_1 - myVal3_4

然后我会调用myMacro,它接受三个参数 - 名称,起始索引,结束索引。我会做这些调用:

  • myMacro(newArray,1,myEndIndex1)或
  • myMacro(newArray,1,myEndIndex2)

3 个答案:

答案 0 :(得分:1)

假设您要选择包含4个值的3个维度中的一个,您可以像这样引用它:

array newArray [*] myVal2: ;

这是因为您的原始数组语句正在创建名为myVal2_1, ... myVal2_4的变量。上面的所有声明都是使用通配符语法来放置以' myVal2'开头的每个变量。进入一个新阵列。

如果您的阵列具有更复杂的名称,则此方法不起作用。您需要寻求更复杂的解决方案。

答案 1 :(得分:0)

我仍然不明白这里的问题究竟是什么。 如果您希望灵活地生成ARRAY语句,如:

array myVals {3,4} myVal1_1 myVal1_4 myVal2_1-myVal2_4 myVal3_1 myVal3_4;

然后你想使用三个参数:

%macro my2dmacro (basename=,dim1=,dim2=);
   %local i ;
array &basename.s {&dim1,&dim2}
    %do i=1 %to &dim1; &basename.&i._1-&basename.&i._&dim2 %end;
;
%mend my2dmacro;

那么如果你用这些值来称呼它:

%my2dmacro(basename=myval,dim1=3,dim2=4);

它将生成此声明:

array myvals {3,4} myval1_1-myval1_4 myval2_1-myval2_4 myval3_1-myval3_4;

当您想要请求1-D阵列时,您可以使用以下内容:

%macro my1dmacro (basename=,dim1=,dim2=);
array &basename.&dim1.s {&dim2} &basename.&dim1._1-&basename.&dim1._&dim2;
%mend my1dmacro;

如果您使用以下值来调用它:

%my1dmacro(basename=myval,dim1=3,dim2=4);

它将生成此声明。

array myval3s {4} myval3_1-myval3_4;

您可以将它们组合成一个宏并使用另一个参数来允许用户指定要生成的ARRAY语句的形式。

答案 2 :(得分:0)

DIM2功能解决了我的问题。我想干净地引用2D数组的一个维度,而不使用宏%do循环来遍历变量名称(正如Robert Penridge的评论中所讨论的那样)。以下是如何使用DIM2仅参考datastep vars。

data test;
   array myVals {3,4} myVal1_1 - myVal1_4
                      myVal2_1 - myVal2_4
                      myVal3_1 - myVal3_4;

   array slice {4} slice_1 - slice_4;

   do i = 1 to 3;
       do j = 1 to DIM2{myVals};
          slice{j} = myVals{i,j}; 
          %do_calculations_on(input1Darray=slice, inputArrayLength=4}
       end;
   end;
run;

上述方法还允许通过颠倒i,j循环的顺序来切割另一个维度

array diff_slice {3} diff_slice1 - diff_slice3;
do j = 1 to 4;
   do i = 1 to DIM1{myVals}; *DIM1 is DIM, or 3 in this case;
      diff_slice{i} = myVals{i, j}
      %do_calculations_on_(input1Darray=diff_slice, inputArrayLength=3);
   end;
end;

正如人们之前提到的,"传递数组"我的宏实际上只是意味着传递一个字符串,该字符串表示变量列表的公共前缀。尽管如此,上面的方法允许我定义一组新的常用前缀变量来传递(slice或diff_slice),它们表示多维数组的任何维度的任何切片,使用数据步骤变量而不必依赖于宏以某种方式组织循环和初始数组名称。