【问题标题】:How to sum a subset of an multidimensional array如何对多维数组的子集求和
【发布时间】:2016-06-05 15:23:52
【问题描述】:

我无法对多维数组的子集中的所有值求和??

_sum = sum(of _valores[_i,_x,_quadrado,*]);

我知道我可以对一维数组求和
E.G. _sum = sum(of _arraName[*]);

代码::

data teste;
    array _quadros{3,3,9} _temporary_;
    array _valores{3,3,9,9} _temporary_;

    /*Zera todos os valores*/
    do _i = 1 to 9;
        do _z = 1 to 3;
            do _t = 1 to 3;
                do _x = 1 to 9;
                    _valores[_z,_t,_i,_x] = 1;
                end;
            end;
        end;
    end;
    do _quadrado = 1 to 9;
        do _i = 1 to 3;
            do _x = 1 to 3;
                _sum = sum(of _valores[_i,_x,_quadrado,*]);
                put _sum =;
            end;
        end;
    end;
run;

错误::

_sum = sum(of _valores[_i,_x,_quadrado,*]);

错误 386-185:需要算术表达式。

错误 200-322:符号无法识别,将被忽略。

ERROR 76-322:语法错误,语句将被忽略。

【问题讨论】:

  • 你有 PROC IML 吗?如果你想做矩阵数学,最好使用适合这种分析的工具。
  • 这实际上是一个很好的问题,可能对那些可以访问 IML 的人有用。
  • 我没有访问权限 =/.

标签: arrays multidimensional-array sum sas


【解决方案1】:

我认为你不能用 sum 函数做到这一点。你可以自己写。

proc fcmp outlib=work.fns.fns;
function sumslice4(inArr[*,*,*,*],a,b,c,d) ;
    _1 = dim(inArr,1);
    _2 = dim(inArr,2);
    _3 = dim(inArr,3);
    _4 = dim(inArr,4);

    _s = 0;

    do i=1 to _1;
        do j=1 to _2;
            do k=1 to _3;
                do l=1 to _4;
                    if (a = i or missing(a)) and
                       (b = j or missing(b)) and
                       (c = k or missing(c)) and
                       (d = l or missing(d)) then

                        _s = sum(_s,inArr[i,j,k,l]) ;
                end;
            end;
        end;
    end;

    return (_s);
endsub;
run;
quit;

这将创建一个函数sumslice4(),它采用一个 4 维数组和一系列索引。您指定要求和的索引。 (可选)添加一个缺失的 . 来指定完整索引。

以下是您的示例的测试:

options cmplib=work.fns;

data test;
    array _values{3,3,9,9} _temporary_;
    do _i = 1 to 9;
        do _z = 1 to 3;
            do _t = 1 to 3;
                do _x = 1 to 9;
                    _values[_z,_t,_i,_x] = 1;
                end;
            end;
        end;
    end;

x = sumslice4(_values,1,1,.,.);
put x=;

x = sumslice4(_values,1,1,1,.);
put x=;

x = sumslice4(_values,1,1,1,1);
put x=;

x = sumslice4(_values,.,1,1,1);
put x=;
run;

我明白了:

x=81
x=9
x=1
x=3

这应该是您所期望的。

【讨论】:

  • 我真的不敢相信 SAS 没有这个选项。我只需要总结最后一个维度。在我看来与一维数组相同。
  • 您必须了解这些是如何处理的。数据步骤实际上只有一维数组。添加多维的能力只是便于索引的语法糖。除此之外,没有真正的维度概念。它旨在非常有效地处理大量平面表结构,而不是多维数组。
【解决方案2】:

改为规范化您的数据并使用PROC SUMMARY

* generate test data ;
data test;
  do i = 1 to 9;
    do z = 1 to 3;
      do t = 1 to 3;
        do x = 1 to 9;
          valores = 1;
          output;
        end;
      end;
    end;
  end;
run;

* Sum across last dimension ;
proc summary data=test nway ;
  class i z t ;
  var valores ;
  output out=want sum= ;
run;

【讨论】:

    猜你喜欢
    • 2012-11-08
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    相关资源
    最近更新 更多