This way uses a three-dimensional array instead of the nested apply. It seems to take the same amount of time, even on larger datasets, but it may give you ideas.
distance=function(x) daisy(x, metric = 'gower') persons=array(dim=c(2,nrow(donor)*nrow(receiver),ncol(receiver))) persons[1,,]=donor[rep(1:nrow(donor),each=nrow(receiver)),] persons[2,,]=receiver[rep(1:nrow(receiver),nrow(donor)),] matrix(apply(persons,2,distance),,nrow(donor)) Tom On Thu, Mar 24, 2011 at 8:23 AM, Stefan Petersson <stefan.peters...@inizio.se> wrote: > > Hi, > > I'm trying to create a distance matrix. And it works out somewhat ok. > However, I suspect that there are > some efficiency issues with my efforts. Plz have a look at this: > > donor <- matrix(c(3,1,2,3,3,1,4,3,5,1,3,2), ncol=4) > receiver <- > matrix(c(1,4,3,2,4,3,1,5,1,3,2,1,4,5,3,5,1,3,2,4,5,1,2,3,1,4,5,5,1,2,1,3,4,3,2,5,5,1,4,2,5,4,3,2), > ncol=4) > > The above creates my two matrices. I have three donors, and eleven receivers > (rows), with four > measures (columns) in each matrix. > > And now, I want to apply the daisy() function from the cluster library, to > calculate distances between my > three donors, and eleven receivers. The end result should be a 11x3 matrix > with distances between the > units from the two matrices. I can calculate one distance measure (ie donor 1 > and receiver 1). Like this: > > library(cluster) > daisy(rbind(donor[1,], receiver[1,]), metric = 'gower') > > My first attempt was a simple nested for-loop. But that one was discarded > after reading up on efficiency > issues with for-looping. So I turned to 'apply' with this result: > > apply(donor, 1, function(b) apply(receiver, 1, function(a) daisy(rbind(b, a), > metric = 'gower'))) > > [,1] [,2] [,3] > [1,] 1.00 0.50 0.75 > [2,] 1.00 0.75 0.75 > [3,] 0.75 1.00 1.00 > [4,] 0.50 0.75 0.75 > [5,] 0.75 1.00 0.75 > [6,] 0.75 1.00 0.50 > [7,] 0.75 0.50 0.75 > [8,] 1.00 1.00 1.00 > [9,] 1.00 0.75 1.00 > [10,] 0.75 0.50 1.00 > [11,] 0.75 1.00 0.25 > > However, something tells me that there is a simpler (more efficient) way of > doing this. I've been reading > up on the Matrix library, but I'm having trouble understanding the > functions... > > ______________________________________________ > R-help@r-project.org mailing list > 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. ______________________________________________ R-help@r-project.org mailing list 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.