[prev in list] [next in list] [prev in thread] [next in thread]
List: sas-l
Subject: Re: IML: comparing two matrices by cell values
From: Dale McLerran <stringplayer_2 () YAHOO ! COM>
Date: 2005-10-31 21:06:16
[Download RAW message or body]
--- "von-hippel.1@osu.edu" <von-hippel.1@OSU.EDU> wrote:
> I am calculating a matrix C from the values in matrices A and B.
>
> In each matrix, I use the first two columns as a kind of index. When
> I
> am looking at a row of C, is there a convenient way to find the rows
> of
> A and B that have the same index?
>
> Here's an example.... Suppose I have two 3-column matrices A and B,
> where B has more rows than A. E.g.:
>
> A =
> {1 1 1,
> 2 2 2};
>
> B =
> {1 1 0,
> 2 1 0,
> 2 2 0};
>
> I want to create a third matrix C with the same dimension as B, and
> cells filled according to the following rule.
>
> C[i,j,1] = B[i,j,1]
> C[i,j,2] = B[i,j,2]
> C[i,j,3] = A[i,j,3] if A[i,j,1]=C[i,j,1] and A[i,j,2]=C[i,j,2]
> = 0 otherwise.
>
> So
>
> C =
> {1 1 1,
> 2 1 0,
> 2 2 2};
>
> How would you go about doing this?
>
> Thanks!
> Paul
>
Paul,
I don't know if there is a more efficient way to accomplish what
you need, but the following code does work. We have to condition
on the i-th row of A and then find all rows of B where the first
two columns match A[i,1] and A[i,2]. The LOC function is employed
to find the rows where this condition is true.
/* First initialize C to B, then initialize column 3 of C to zero */
C = B;
C[,3]=0;
/* Loop over rows of A and find rows of B that match A[i,1] */
/* and A[i,2]. For rows of B which match, set B[j,3]=A[i,3] */
nrow_A = nrow(A);
do i=1 to nrow_A;
j = loc(B[,1]=A[i,1] & B[,2]=A[i,2]);
if nrow(j)>0 then do;
C[j,3] = A[i,3];
end;
end;
print C;
Note that if there are rows in A which do not have matching first
two columns in B, then the index j cannot be constructed and the
number of rows for the symbol j will be zero. We only set the
value of C[j,3]=A[i,3] when we do find (at least) one row of
B which has the same values for columns 1 and 2 as are observed
for the current row of A.
HTH,
Dale
---------------------------------------
Dale McLerran
Fred Hutchinson Cancer Research Center
mailto: dmclerra@NO_SPAMfhcrc.org
Ph: (206) 667-2926
Fax: (206) 667-5977
---------------------------------------
__________________________________
Yahoo! Mail - PC Magazine Editors' Choice 2005
http://mail.yahoo.com
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic