2016-02-23 50 views
1

我無法對多維數組的子集中的所有值求和?如何求和多維數組的一個子集

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

我知道我可以總結一維數組
E.G. _sum = sum(_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,*]);

ERROR 386-185: Expecting an arithmetic expression.

ERROR 200-322: The symbol is not recognized and will be ignored.

ERROR 76-322: Syntax error, statement will be ignored.

+0

您是否有PROC IML?如果你想做矩陣運算,最好使用適合這種分析的工具。 – Reeza

+0

這實際上是一個很好的問題,對於那些有權訪問IML的人來說可能很有用。 – DomPazz

+0

我沒有訪問= /。 –

回答

2

我不認爲你可以用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 

這應該是你期待什麼。

+0

我真的不敢相信SAS沒有這個選項。我只需要總結最後一個維度。在我看來,與一維數組是一樣的。 –

+0

你必須瞭解這些如何處理。 Data Step實際上只有1維數組。添加多維的能力僅僅是簡單索引的語法糖。除此之外,沒有真正的維度概念。它被設計用於非常有效地處理大量的平坦表格結構,而不是多維數組。 – DomPazz

1

正常化您的數據,並使用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; 
相關問題