Hi Aptech,
I have a question like this, if I have a matrix in the form of
X=[A 2, B 3, C 5, B 4]
I want to produce a matrix like this
Y=[A 2 NA,
B 3 4,
C 5 NA]
Could you please tell me how I can get this.
Thank you very much !
1 Answer
0
Below is a procedure that should work. I would encourage you to step through this with the debugger to help you to understand how it works.
X = { A 2, B 3, C 5, B 4 };
X_new = collapseObs(X);
proc (1) = collapseObs(X);
local U, mask, max_len, Y, Y_row;
//Find the unique identifiers
//from column 1
U = unique(X[.,1], 0);
//each column of 'mask' corresponds
//to a row from 'U', above
mask = (X[.,1] .$== U');
//Find out the maximum number of
//elements corresponding to any
//of the unique values in 'U'
max_len = maxc(sumc(mask));
//Fill a matrix full of missing values
Y = reshape(error(0), rows(U), max_len + 1);
//Overlay unique values from 'U'
//into first column
Y[.,1] = U;
//Fill in observations
for i(1, rows(Y), 1);
//Find observations for the
//i'th element of 'U'
Y_row = selif(X[.,2], mask[.,i])';
Y[i, 2:cols(Y_row)+1] = Y_row;
endfor;
retp(Y);
endp;
Your Answer
1 Answer
0
Below is a procedure that should work. I would encourage you to step through this with the debugger to help you to understand how it works.
X = { A 2, B 3, C 5, B 4 };
X_new = collapseObs(X);
proc (1) = collapseObs(X);
local U, mask, max_len, Y, Y_row;
//Find the unique identifiers
//from column 1
U = unique(X[.,1], 0);
//each column of 'mask' corresponds
//to a row from 'U', above
mask = (X[.,1] .$== U');
//Find out the maximum number of
//elements corresponding to any
//of the unique values in 'U'
max_len = maxc(sumc(mask));
//Fill a matrix full of missing values
Y = reshape(error(0), rows(U), max_len + 1);
//Overlay unique values from 'U'
//into first column
Y[.,1] = U;
//Fill in observations
for i(1, rows(Y), 1);
//Find observations for the
//i'th element of 'U'
Y_row = selif(X[.,2], mask[.,i])';
Y[i, 2:cols(Y_row)+1] = Y_row;
endfor;
retp(Y);
endp;
