If you want to extract values from a SAS/IML vector, use the subscripting operation, such as in the following example:

proc iml; x = {A B C D E}; y = x[{1 2 3}]; /* {A,B,C} */ |

The vector `y` contains the first three elements of `x`. However, did you know that you can specify the indexes in any order?

z = x[{3 1 2}]; /* {C,A,B} */ |

The vector `z` contains the third, first, and second elements, in that order, of the vector `x`.

Furthermore, did you know that you can repeat indices to duplicate elements? And that you can extract many values?

w = x[{1 2 5 4 1 3 1 2}]; /* {A,B,E,D,A,C,A,B} */ |

This last example might cause you to wonder whether you can use this operation as a sampling method. Yes! This technique is one way to sample with replacement in the SAS/IML language.
Sampling from `x` is easy: randomly generate *N* integer values between 1 and `ncol(x)`, and use those values as indices to extract values from `x`:

N = 10; /* number of obs to sample */ r = j(1, N); /* allocate vector for indices */ call randgen(r, "uniform"); /* fill r with U[0,1] */ r = ceil(ncol(x)*r); /* create integers in [1, ncol(x)] */ y = x[r]; /* generate sample from x of size N */ |

This post is based on a tip from @RLangTip that I saw on Twitter. Many tips for doing something efficiently in the R language are equally applicable to other matrix-vector languages such as SAS/IML and MATLAB, and vice versa.