I don't see any reason why a loop is out of the question, and answering would have been much easier if you'd included the requested reproducible data, but what about this?
This solution is robust to pairs from idcell being absent in censDist, and to the difference from A to B being different than the distance from B to A, but not to A-B appearing twice. If that's possible, you'll need to figure out how to manage it. # create some fake data idcell <- data.frame( id = seq_len(5), fcell = sample(1:100, 5)) censDist <- expand.grid(fcell=seq_len(100), cellneigh=seq_len(100)) censDist$distance <- runif(nrow(censDist)) # assemble the non-symmetric distance matrix result <- subset(censDist, fcell %in% idcell$fcell & cellneigh %in% idcell$fcell) result.m <- matrix(NA, nrow=nrow(idcell), ncol=nrow(idcell)) result.m[factor(result$fcell), factor(result$cellneigh)] <- result$distance Sarah On Thu, May 12, 2016 at 5:26 AM, A M Lavezzi <mario.lave...@unipa.it> wrote: > Hello, > > I have a sample of 1327 locations, each one idetified by an id and a > numerical code. > > I need to build a spatial matrix, say, M, i.e. a 1327x1327 matrix > collecting distances among the locations. > > M(i,i) should be 0, M(i,j) should contain the distance among location i and > j > > I shoud use data organized in the following way: > > 1) id_cell contains the identifier (id) of each location (1...1327) and the > numerical code of the location (f_cell) (see head of id_cell below) > >> head(id_cell) > id f_cell > 1 1 2120 > 12 2 204 > 22 3 2546 > 24 4 1327 > 34 5 1729 > 43 6 2293 > > 2) censDist contains, for each location identified by its numerical code, > the distance to other locations (censDist has 1.5 million rows). The > head(consist) below, for example, reads like this: > > location 2924 has a distance to 2732 of 1309.7525 > location 2924 has a distance to 2875 of 696.2891, > etc. > >> head(censDist) > f_cell f _cell_neigh distance > 1 2924 2732 1309.7525 > 2 2924 2875 696.2891 > 3 2924 2351 1346.0561 > 4 2924 2350 1296.9804 > 5 2924 2725 1278.1877 > 6 2924 2721 1346.9126 > > > Basically, for every location in id_cell I should pick up the distance to > other locations in id_cell from censDist, and allocate it in M > > I have not come up with a satisfactory vectorizion of this problem and > using a loop is out of question. > > Thanks for your help > Mario > > ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.