Turn on suggestions

Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

Showing results for

Options

- RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Mute
- Printer Friendly Page

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

Posted 01-30-2015 03:37 PM
(992 views)

For example, Column 1 Row 1 would be a total. The Column 2 Row 1 plus Column 1 Row 2, then COL3 Row1+Col2 Row 2+ Col1 Row3, etc. For however many columns I have. It isnt a square matrix so once the columns exceed the rows it wouldnt match to the first column.

Header 1 | Header 2 | Header 3 | Header 4 | Header 5 |
---|---|---|---|---|

A | B | C | D | |

A | B | C | D | |

B | C | D |

So for example above, I would want the totals of A, B, C, D etc.

I have the matrix, now just not sure how to add up what I need.

Any ideas?

3 REPLIES 3

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

I have a function to do exactly this. It creates the 'shift' that you mention by manipulating the row index numbers of a matrix in its sparse format (details of the format can be found in the documentation for the SPARSE function). The result when converted back to normal form, with the FULL function, is a new matrix with one row for every antidiagonal. Finally it is a simple matter to sum the rows of this new matrix.

start AntiDiagSum( x );

nr = nrow( x );

nc = ncol( x );

s = sparse( x );

s[ , 2] = s[ , 2] + s[ , 3] - 1;

return( full( s , nr + nc - 1, nc )[ , +] );

finish;

/* get example 3x5 matrix */

a = shape(1:15, 3, 5);

print a;

/* required sums are from the 2nd to 5th antidiagonals */

b = AntiDiagSum(a)[2:5];

print b;

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

I don't how to do it with IML . But I can get it via data step. Maybe Rick can give IML solution.

data have; input a1-a5; cards; 99 1 2 3 4 1 2 3 4 99 2 3 4 99 99 ; run; data temp; set have; array x{*} a1-a5; do j=dim(x)-_n_+1 to 1 by -1; x{j+_n_-1}=x{j}; end; do i=1 to _n_-1; x{i}=.; end; drop i j; run; proc means data=temp sum; var a2-a5; run;

Xia Keshan

Registration is open! SAS is returning to Vegas for an AI and analytics experience like no other! Whether you're an executive, manager, end user or SAS partner, SAS Innovate is designed for everyone on your team. Register for just $495 by 12/31/2023.

**If you are interested in speaking, there is still time to submit a session idea. More details are posted on the website. **

Multiple Linear Regression in SAS

Learn how to run multiple linear regression models with and without interactions, presented by SAS user Alex Chaplin.

Find more tutorials on the SAS Users YouTube channel.