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.