[R] Copying rows from a matrix using a vector of indices
Marc Schwartz (via MN)
mschwartz at mn.rr.com
Wed Aug 17 22:10:31 CEST 2005
On Wed, 2005-08-17 at 12:02 -0700, Martin Lam wrote:
> Hi,
>
> I am trying to use a vector of indices to select some
> rows from a matrix. But before I can do that I somehow
> need to convert 'combinations' into a list, since
> 'mode(combinations)' says it's 'numerical'. Any idea
> how I can do that?
>
> library("combinat")
>
> combinations <- t(combn(8,2))
>
> indices <- c(sample(1:length(combinations),10))
>
> # convert
> ???
>
> subset <- combinations[indices]
>
> Thanks in advance,
>
> Martin
Your goal is not entirely clear. Given your code above, you end up
with:
> library("combinat")
>
> combinations <- t(combn(8,2))
> combinations
[,1] [,2]
[1,] 1 2
[2,] 1 3
[3,] 1 4
[4,] 1 5
[5,] 1 6
[6,] 1 7
[7,] 1 8
[8,] 2 3
[9,] 2 4
[10,] 2 5
[11,] 2 6
[12,] 2 7
[13,] 2 8
[14,] 3 4
[15,] 3 5
[16,] 3 6
[17,] 3 7
[18,] 3 8
[19,] 4 5
[20,] 4 6
[21,] 4 7
[22,] 4 8
[23,] 5 6
[24,] 5 7
[25,] 5 8
[26,] 6 7
[27,] 6 8
[28,] 7 8
combinations is a 28 x 2 matrix (or a 1d vector of length 56).
Your use of sample() with '1:length(combinations)' is the same as 1:56.
> length(combinations)
[1] 56
Hence, you end up with:
> set.seed(128)
> indices <- sample(1:length(combinations), 10)
> indices
[1] 41 53 38 46 50 44 25 11 43 7
I suspect that you really want to use '1:nrow(combinations)', which
yields 1:28.
> nrow(combinations)
[1] 28
Thus,
> set.seed(128)
> indices <- sample(1:nrow(combinations), 10)
> indices
[1] 21 26 18 22 23 20 11 5 27 3
Now, you can use:
> subset <- combinations[indices, ]
> subset
[,1] [,2]
[1,] 4 7
[2,] 6 7
[3,] 3 8
[4,] 4 8
[5,] 5 6
[6,] 4 6
[7,] 2 6
[8,] 1 6
[9,] 6 8
[10,] 1 4
which yields the rows from combinations, defined by 'indices'.
If correct, please review "An Introduction to R" and ?"[" for more
information on subsetting objects in R.
HTH,
Marc Schwartz
More information about the R-help
mailing list