set.seed(1) (DFid <- data.frame( x = sample(1:20,10), y = sample(1:20,10), IDs = sapply(1:10,function(i) paste("ID",i,sep=""))))
require(spdep) coordinates(DFid) <- ~x+y coords <- coordinates(DFid) dnn4 <- dnearneigh(DFid,0,4) summary(dnn4) plot(DFid) plot(dnn4,coords,add=T,col=2) nb2mat(dnn4, zero.policy=TRUE) This just one option from the multitude of spatial packages. HTH On Sun, Feb 26, 2012 at 4:55 PM, Ross Dwyer <ross.dw...@uq.edu.au> wrote: > Dear List, > > I have been trying to extract associations from a matrix whereby individual > locations are within a certain distance threshold from one another. > > I have been able to extract those individuals where there is 'no interaction' > (i.e. where these individuals are not within a specified distance threshold > from another individual) and give these individuals a unique Group ID > containing that one individual. > > i.e. > > ID Group > > 1 ID1 1 > > 2 ID3 2 > > 3 ID4 3 > > 4 ID5 4 > > 5 ID7 5 > > 6 ID8 6 > > 7 ID9 7 > > > What I need assistance with is allocating associations with a unique group id. > i.e. If we have interactions between "ID2_ID6", "ID6_ID2", "ID6_ID10", > "ID10_ID6" as in the example code... > > > ID Group > > 1 ID1 1 > > 2 ID3 2 > > 3 ID4 3 > > 4 ID5 4 > > 5 ID7 5 > > 6 ID8 6 > > 7 ID9 7 > > ## > 8 ID2 8 > 9 ID6 8 > 10 ID10 8 > > ## > The code also needs to robust enough to recognize instances where we have an > interaction in a separate group... > i.e. "ID11_ID12" should be in a separate group (Group 9) as they don't > interact with IDs 2, 6, or 10 (not in below code!) > 11 ID11 9 > 12 ID12 9 > > > I've been trying to figure this out but have drawn a blank. My example code > can be found below. > > Very best wishes, > > Ross > > Dr Ross Dwyer > Postdoctoral Research Fellow > University of Queensland > > > >> ### >> require(stats) >> x <- sample(1:20,10) >> y <- sample(1:20,10) >> IDs <- sapply(1:10,function(i) paste("ID",i,sep="")) >> (DFid <- data.frame(x,y)) > x y > 1 7 20 > 2 5 3 > 3 12 5 > 4 3 12 > 5 18 19 > 6 2 1 > 7 19 15 > 8 20 11 > 9 13 14 > 10 1 2 >> >> >> (DMdist <- dist(DFid, method = "euclidean", > + diag = FALSE, upper = TRUE)) > 1 2 3 4 5 6 7 > 8 9 10 > 1 17.117243 15.811388 8.944272 11.045361 19.646883 13.000000 > 15.811388 8.485281 18.973666 > 2 17.117243 7.280110 9.219544 20.615528 3.605551 18.439089 > 17.000000 13.601471 4.123106 > 3 15.811388 7.280110 11.401754 15.231546 10.770330 12.206556 > 10.000000 9.055385 11.401754 > 4 8.944272 9.219544 11.401754 16.552945 11.045361 16.278821 > 17.029386 10.198039 10.198039 > 5 11.045361 20.615528 15.231546 16.552945 24.083189 4.123106 > 8.246211 7.071068 24.041631 > 6 19.646883 3.605551 10.770330 11.045361 24.083189 22.022716 > 20.591260 17.029386 1.414214 > 7 13.000000 18.439089 12.206556 16.278821 4.123106 22.022716 > 4.123106 6.082763 22.203603 > 8 15.811388 17.000000 10.000000 17.029386 8.246211 20.591260 4.123106 > 7.615773 21.023796 > 9 8.485281 13.601471 9.055385 10.198039 7.071068 17.029386 6.082763 > 7.615773 16.970563 > 10 18.973666 4.123106 11.401754 10.198039 24.041631 1.414214 22.203603 > 21.023796 16.970563 >> >> #Generate True/False matrix on those individuals < 4 units apart >> DMTF <- apply(as.matrix(DMdist), c(1,2), function(x) ifelse(x<=4,T,F)) >> diag(DMTF)<- NA #replace diagonal with NA >> dimnames(DMTF) <- list(IDs, IDs) #add individual's name to matrix >> >> DMTF > ID1 ID2 ID3 ID4 ID5 ID6 ID7 ID8 ID9 ID10 > ID1 NA FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE > ID2 FALSE NA FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE > ID3 FALSE FALSE NA FALSE FALSE FALSE FALSE FALSE FALSE FALSE > ID4 FALSE FALSE FALSE NA FALSE FALSE FALSE FALSE FALSE FALSE > ID5 FALSE FALSE FALSE FALSE NA FALSE FALSE FALSE FALSE FALSE > ID6 FALSE TRUE FALSE FALSE FALSE NA FALSE FALSE FALSE TRUE > ID7 FALSE FALSE FALSE FALSE FALSE FALSE NA FALSE FALSE FALSE > ID8 FALSE FALSE FALSE FALSE FALSE FALSE FALSE NA FALSE FALSE > ID9 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE NA FALSE > ID10 FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE NA >> >> irow <- as.character(gl(length(IDs),length(IDs),labels=IDs)) >> icol <-rep(IDs, length(IDs)) >> >> AssocMatrix <- matrix(data=paste(irow,"_",icol,"_",sep=""), > + nrow = length(IDs), ncol = length(IDs), > + dimnames= list(IDs, IDs)) >> >> AssocMatrix > > ID1 ID2 ID3 ID4 ID5 ID6 > ID7 ID8 ID9 ID10 > > ID1 "ID1_ID1_" "ID2_ID1_" "ID3_ID1_" "ID4_ID1_" "ID5_ID1_" "ID6_ID1_" > "ID7_ID1_" "ID8_ID1_" "ID9_ID1_" "ID10_ID1_" > > ID2 "ID1_ID2_" "ID2_ID2_" "ID3_ID2_" "ID4_ID2_" "ID5_ID2_" "ID6_ID2_" > "ID7_ID2_" "ID8_ID2_" "ID9_ID2_" "ID10_ID2_" > > ID3 "ID1_ID3_" "ID2_ID3_" "ID3_ID3_" "ID4_ID3_" "ID5_ID3_" "ID6_ID3_" > "ID7_ID3_" "ID8_ID3_" "ID9_ID3_" "ID10_ID3_" > > ID4 "ID1_ID4_" "ID2_ID4_" "ID3_ID4_" "ID4_ID4_" "ID5_ID4_" "ID6_ID4_" > "ID7_ID4_" "ID8_ID4_" "ID9_ID4_" "ID10_ID4_" > > ID5 "ID1_ID5_" "ID2_ID5_" "ID3_ID5_" "ID4_ID5_" "ID5_ID5_" "ID6_ID5_" > "ID7_ID5_" "ID8_ID5_" "ID9_ID5_" "ID10_ID5_" > > ID6 "ID1_ID6_" "ID2_ID6_" "ID3_ID6_" "ID4_ID6_" "ID5_ID6_" "ID6_ID6_" > "ID7_ID6_" "ID8_ID6_" "ID9_ID6_" "ID10_ID6_" > > ID7 "ID1_ID7_" "ID2_ID7_" "ID3_ID7_" "ID4_ID7_" "ID5_ID7_" "ID6_ID7_" > "ID7_ID7_" "ID8_ID7_" "ID9_ID7_" "ID10_ID7_" > > ID8 "ID1_ID8_" "ID2_ID8_" "ID3_ID8_" "ID4_ID8_" "ID5_ID8_" "ID6_ID8_" > "ID7_ID8_" "ID8_ID8_" "ID9_ID8_" "ID10_ID8_" > > ID9 "ID1_ID9_" "ID2_ID9_" "ID3_ID9_" "ID4_ID9_" "ID5_ID9_" "ID6_ID9_" > "ID7_ID9_" "ID8_ID9_" "ID9_ID9_" "ID10_ID9_" > > ID10 "ID1_ID10_" "ID2_ID10_" "ID3_ID10_" "ID4_ID10_" "ID5_ID10_" "ID6_ID10_" > "ID7_ID10_" "ID8_ID10_" "ID9_ID10_" "ID10_ID10_" >> >> (AMatrix <- as.character(unique(AssocMatrix[which(DMTF==TRUE)]))) > [1] "ID2_ID6" "ID6_ID2" "ID6_ID10" "ID10_ID6" >> > >> ##Extract those individuals not in any interactions > >> nonassoc <- IDs[is.na(charmatch(inassoc,AMatrix))] > >> > >> (NGroups <- data.frame(ID=nonassoc,Group=1:length(nonassoc))) > > ID Group > > 1 ID1 1 > > 2 ID3 2 > > 3 ID4 3 > > 4 ID5 4 > > 5 ID7 5 > > 6 ID8 6 > > 7 ID9 7 > > > >> > > > > > > [[alternative HTML version deleted]] > > ______________________________________________ > 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.