An embedded and charset-unspecified text was scrubbed... Name: not available URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20120227/6078aab2/attachment.pl>
Matrix problem to extract animal associations
2 messages · Ross Dwyer, ilai
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.dwyer at 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 at 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.