2016-01-17 5 views
0

У меня есть «тест» таблицы как this-Добавить столбцы вертикально в SAS

 M1 M2 M3 M4 M5 M6 M7   
    A A1 A2 A3 A4 A5 A6 A7   
    B B1 B2 B3 B4 B5 B6 .   
    C C1 C2 C3 C4 C5 . .   
    D D1 D2 D3 D4 . . .   
    E E1 E2 E3 . . . .   
    F F1 F2 . . . . .   
    G G1 . . . . . .  

Я хочу, чтобы добавить столбцы в следующем ПУТЬ

M1=(A1+B1+C1+D1+E1+F1+G1)  
    M2=(A2+B2+C2+D2+E2+F2)+(A1+B1+C1+D1+E1+F1)  
    M3=(A3+B3+C3+D3+E3)+(A2+B2+C2+D2+E2)+(A1+B1+C1+D1+E1)  
    M4=(A4+B4+C4+D4)+(A3+B3+C3+D3)+(A2+B2+C2+D2)+(A1+B1+C1+D1)  
    M5=(A5+B5+C5)+(A4+B4+C4)+(A3+B3+C3)+(A2+B2+C2)+(A1+B1+C1)  
    M6=(A6+B6)+(A5+B5)+(A4+B4)+(A3+B3)+(A2+B2)+(A1+B1)  
    M7=(A7)+(A6)+(A5)+(A4)+(A3)+(A2)+(A1)  

Количество строк и столбцов МАЕ увеличение или уменьшение в моей таблице, то есть мои столбцы могут быть от M1 до MN. Я хочу взять сумму до MN таким же образом. Я не уверен, как начать с этой проблемы. Пожалуйста помоги.

+0

Какой выход вы хотите? Только одно наблюдение с N столбцами? Или вам нужен какой-то тип матрицы? Можете ли вы добавить пример с цифрами? Возможно, для N = 3 или 4? – Tom

+0

У вас есть PROC IML? – DomPazz

+0

Я хочу выход, как this- Колонка \t Сумма М1 \t (А1 + В1 + С1 + D1 + Е1 + F1 + G1) М2 \t (A2 + B2 + C2 + D2 + Е2 + F2) + (А1 + B1 + C1 + D1 + E1 + F1) M3 \t (A3 + B3 + C3 + D3 + E3) + (A2 + B2 + C2 + D2 + E2) + (A1 + B1 + C1 + D1 + E1) M4 \t (A4 + B4 + C4 + D4) + (A3 + B3 + C3 + D3) + (A2 + B2 + C2 + D2) + (A1 + B1 + C1 + D1) M5 \t (A5 + B5 + C5) + (A4 + B4 + C4) + (A3 + B3 + C3) + (A2 + B2 + C2) + (A1 + B1 + C1) M6 \t (A6 + B6) + (A5 + B5) + (A4 + B4) + (A3 + B3) + (A2 + B2) + (A1 + B1) M7 \t (A7) + (A6) + (A5) + (A4) + (A3) + (A2) + (A1) – user1463242

ответ

0

Здесь вы идете. Я суммирую как строки, так и столбцы.

Я работаю извне, так что мне не нужно делать временные копии сумм столбцов.

Первый: Составьте цифры в квадрате (суммируйте столбцы).

Второй: вычесть рядовые ряды для внешних значений.

data have; 
input row $ M1-M7; 
datalines; 
A 1 1 1 1 1 1 1 
B 2 2 2 2 2 2 . 
C 3 3 3 3 3 . . 
D 4 4 4 4 . . . 
E 5 5 5 . . . . 
F 6 6 . . . . . 
G 7 . . . . . . 
; 
run; 

data row_sums; 
set have end=last; 
array M[7] ; 
array RS[7]; 
retain RS:; 
rs[_n_] = sum(of M[*]); 
if last; 
keep rs1-rs7; 
run; 

proc summary data=have; 
var M:; 
output out=col_sums(drop=_type_ _freq_) sum=; 
run; 

data want; 
merge col_sums row_sums; 
array M[7] ; 
array RS[7]; 

do i=7 to 2 by -1; 
    do j=i-1 to 1 by -1; 
     M[i] = M[i] + M[j]; 
    end; 
    do j=7 to 9-i by -1; 
     M[i] = M[i] - RS[j]; 
    end; 
end; 
drop RS: i j; 
run; 

я получаю:

     M1 M2 M3 M4 M5 M6 M7 

         28 42 45 40 30 18  7 
0

Так что для M1 (давайте назовем этот столбец 1) вы хотите, сумма значений в «N х 1» подматрицы. А для MN (столбец N) вы хотите получить сумму значения в подматрице 1 x N. Итак, для MX (столбец X) вы хотите получить сумму значений в подматрице (N+1-X) x X.

Было бы проще, если бы вы определили прямоугольники другим способом, поскольку SAS будет обрабатывать значения по строкам по умолчанию. Но мы можем собрать их в массив, а затем вывести их в конце шага данных.

%let n=7; 
data want; 
set have end=eof; 
array m m1-m&n; 
array S (&n) _temporary_ ; 
array result (&n) _temporary_ ; 
row+1; 
col=&n+1-row; 
* build up column totals ; 
do i=1 to col ; 
    s(i)=sum(0,s(i),m(i)); 
end; 
* add across to get total for this column ; 
do i=1 to col ; 
    result(col)=sum(0,result(col),s(i)); 
end; 
if eof then do; 
    * copy back to the "m" variables ; 
    do i=1 to &n ; 
    m(i) = result(i); 
    end; 
    output; 
    put (m1-m&n) (=); 
end; 
run; 
0

Вот одно шаговое решение для данных. Идея отслеживает совокупную сумму каждой строки и добавляет ее к текущей суммарной сумме столбца.

%let n = 7; 
data want; 
do until (eof); 
    set have end=eof; 
    array m(*) m1-m&n; 
    array ms(&n); 

    _sum = 0; * reset cum row sum; 
    do _i = 1 to dim(m); 
     if missing(m(_i)) then leave; 
     _sum + m(_i); * cumulative sum of row; 
     ms(_i) + _sum; * cumulative sum of column; 
    end; 
end; 
output; 
drop row m1-m&n _:; 
run; 

enter image description here

Смежные вопросы