Often you need fast access/lookup in R. For instance assume that you have the following data frame/matrix dat
>head(dat)
x y z
[1,] 1 1 1 0.46 -0.89 0.88 -0.21 0.46 0.93 1.06
[2,] 1 1 2 0.72 -0.40 1.71 -0.52 0.95 NA NA
[3,] 1 1 3 -0.49 -0.42 -0.26 -0.06 1.07 1.48 1.08
[4,] 1 1 4 -1.55 -0.90 0.15 -0.60 1.86 -1.15 NA
[5,] 1 1 5 -0.46 -1.54 -0.40 NA NA NA NA
[6,] 1 1 6 0.14 1.13 -2.42 0.86 0.13 -1.60 0.62
x, y and z represent an unique index and the rest of the columns represent a vector. The vectors may be of various length. To find the vector corresponding to index (x,y,z) you can do a normal search:
> x<-1 > y<-1 > z<-5 > tmp<-dat[dat[,1]==x & dat[,2]==y & dat[,3]==z,4:10] > tmp[which(!is.na(tmp))] [1] -0.46 -1.54 -0.40
However, if dat is big this approach may be to slow. Another approach may be to store the vectors in an array instead:
lookup<-array(list(),c(max(dat[,1]),max(dat[,2]),max(dat[,3]))) # create an array of empty lists
addVec<-function(x) {
tmp<-as.numeric(x[4:10])
lookup[[x[1],x[2],x[3]]]<<-tmp[which(!is.na(tmp))]
invisible(NULL)
}
apply(dat,1,addVec)
lookup[[x,y,z]] # make a direct lookup in the array
[1] -0.46 -1.54 -0.40
Note that all kinds of objects can be stored in the array since you may store listes too.