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.