[R] Referring to matrix elements by name, iteratively

Berend Hasselman bhh at xs4all.nl
Mon Oct 15 21:51:21 CEST 2012


On 15-10-2012, at 19:57, AHJ wrote:

> #Here is a vector of IDs
> 
>> cwaves
> [1]    86    90   185   196   197   209   210   215   216   217   218 
> 
> #Here is a matrix. The rows and columns correspond to the IDs in cwaves, and
> the matrix is populated with a coefficient
> 
>> mat
>     86 90 185 196 209     210 215      216      217      218
> 86    0  0   0   0   0 0.00000   0 0.000000 0.000000 0.000000
> 90    0  0   0   0   0 0.00000   0 0.000000 0.000000 0.000000
> 185   0  0   0   0   0 0.00000   0 0.062500 0.000000 0.015625
> 196   0  0   0   0   0 0.06250   0 0.000000 0.031250 0.000000
> 197   0  0   0   0   0 0.06250   0 0.000000 0.000000 0.000000
> 209   0  0   0   0   0 0.00000   0 0.000000 0.062500 0.000000
> 210   0  0   0   0   0 0.00000   0 0.000000 0.062500 0.000000
> 215   0  0   0   0   0 0.00000   0 0.000000 0.031250 0.000000
> 216   0  0   0   0   0 0.00000   0 0.000000 0.000000 0.000000
> 217   0  0   0   0   0 0.03125   0 0.031250 0.000000 0.000000
> 218   0  0   0   0   0 0.00000   0 0.000000 0.000000 0.031250
> 1162  0  0   0   0   0 0.00000   0 0.003906 0.007812 0.015625
> 1323  0  0   0   0   0 0.00000   0 0.007812 0.007812 0.000000
> 1338  0  0   0   0   0 0.00000   0 0.000000 0.000000 0.003906
> 1709  0  0   0   0   0 0.00000   0 0.000000 0.000000 0.000000
> 
>> dput(mat)
> structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0625, 
> 0.0625, 0, 0, 0, 0, 0.03125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0625, 0, 0, 0, 0, 0, 0, 0.03125, 
> 0, 0.003906, 0.007812, 0, 0, 0, 0, 0, 0.03125, 0, 0.0625, 0.0625, 
> 0.03125, 0, 0, 0, 0.007812, 0.007812, 0, 0, 0, 0, 0.015625, 0, 
> 0, 0, 0, 0, 0, 0, 0.03125, 0.015625, 0, 0.003906, 0), .Dim = c(15L, 
> 10L), .Dimnames = list(c("86", "90", "185", "196", "197", "209", 
> "210", "215", "216", "217", "218", "1162", "1323", "1338", "1709"
> ), c("86", "90", "185", "196", "209", "210", "215", "216", "217", 
> "218")))
> 
> #I know I can refer to element [4,6] in two ways, with the index, or with
> the name
> 
>> mat[4,6]
> [1] 0.0625
>> mat["196","210"]
> [1] 0.0625
> 
> But I want to use cwaves[4] and cwaves[10] to get the name, because this is
> part of an iteration through thousands of IDs.
> 
> This didn't work, of course, because it tries to pull out mat[196,217] which
> doesn't exist. 
>> mat[cwaves[4], cwaves[10]]
> Error: subscript out of bounds
>> mat["cwaves[4]", "cwaves[10]"]
> Error: subscript out of bounds
> 
> I also tried to put the name in a variable to then use as the index, and the
> same thing happens, of course. 
>> a <- cwaves[4]
>> b <- cwaves[10]
>> mat[a,b]
> Error: subscript out of bounds
>> mat["a","b"]
> Error: subscript out of bounds
> 
> Is it possible to do this? I hope the way I language it makes sense. 

Turn cwaves into a vector of characters:

cwaves <- as.character(cwaves)

Now you should be able to index like this: mat[cwaves[4], cwaves[10]]

Berend
 



More information about the R-help mailing list