Oops! Tally the entire matrix, not just the upper triangular portion.
Adding the code in red (4th line from top) should rectify the error.
for(i in 1:(nrow(x)-1)){
for(j in (i+1):nrow(x)){
mat[i,j] <- x$min[j] <= x$max[i]
*mat[j,i] <- mat[i,j]*
}
}
On Tue, Jul 14, 2015 at 7:02 PM, Sargeant, Glen <gsargeant at usgs.gov>
wrote:
#Data. Each row gives altitudinal limits for a species
x <- matrix(runif(20),10,2)
dimnames(x) <- list(NULL, c("min","max"))
species <- paste("species",1:10,sep="")
x <- data.frame(species,x)
species min max
1 species1 0.20903724 0.8232747
2 species2 0.25137925 0.7794901
3 species3 0.09128804 0.2311824
4 species4 0.07792821 0.8668317
5 species5 0.34627541 0.5385044
6 species6 0.14072631 0.3356345
7 species7 0.52154781 0.9216631
8 species8 0.03126684 0.3382409
9 species9 0.43925482 0.4398011
10 species10 0.41146614 0.4611622
#Order by min and then by max within min
x <- x[order(x$min,x$max),]
species min max
8 species8 0.03126684 0.3382409
4 species4 0.07792821 0.8668317
3 species3 0.09128804 0.2311824
6 species6 0.14072631 0.3356345
1 species1 0.20903724 0.8232747
2 species2 0.25137925 0.7794901
5 species5 0.34627541 0.5385044
10 species10 0.41146614 0.4611622
9 species9 0.43925482 0.4398011
7 species7 0.52154781 0.9216631
#Compare each minimum to preceding maxima.
#This is where the reordering comes in.
#The only way two species can overlap is if
#the minimum for the second one is less than
#or equal to the maximum for the first one.
mat <- matrix(NA,nrow(x),nrow(x))
dimnames(mat) <- list(x$species,x$species)
+ for(j in (i+1):nrow(x)){
+ mat[i,j] <- x$min[j] <= x$max[i]
+ }
+ }
species8 species4 species3 species6 species1 species2 species5
species10 species9 species7
species8 NA TRUE TRUE TRUE TRUE TRUE
FALSE FALSE FALSE FALSE
species4 NA NA TRUE TRUE TRUE TRUE
TRUE TRUE TRUE TRUE
species3 NA NA NA TRUE TRUE FALSE
FALSE FALSE FALSE FALSE
species6 NA NA NA NA TRUE TRUE
FALSE FALSE FALSE FALSE
species1 NA NA NA NA NA TRUE
TRUE TRUE TRUE TRUE
species2 NA NA NA NA NA NA
TRUE TRUE TRUE TRUE
species5 NA NA NA NA NA NA
NA TRUE TRUE TRUE
species10 NA NA NA NA NA NA
NA NA TRUE FALSE
species9 NA NA NA NA NA NA
NA NA NA FALSE
species7 NA NA NA NA NA NA
NA NA NA NA
apply(mat,1,sum,na.rm=TRUE)
species8 species4 species3 species6 species1 species2 species5
species10 species9 species7
5 8 2 2 5 4
3 1 0 0
On Tue, Jul 14, 2015 at 6:37 PM, Karla Shikev <karlashikev at gmail.com>
wrote:
Ok, here's another (a bit more challenging) question.
Imagine that I have a S species and a S x 2 matrix of altitudinal limits
(min and max elevation). How would you compute the number of co-occurring
species for each of the S species?
Thanks again for your assistance.
Karla
On Tue, Jul 14, 2015 at 5:14 AM, Stefano Leonardi <
stefano.leonardi at unipr.it
The first think that came to my mind:
overlap <- function(v1,v2) {
ov <-min(max(v1), max(v2)) - max(min(v1), min(v2))
ifelse(ov > 0, ov, 0)
}
overlap(dat[1,], dat[2,])
[1] 0.5
Ciao
Stefano
On 14/07/2015 01:03, Karla Shikev wrote:
Hi there,
This is a newbie question, and I'm sure there are simple ways to do
but I've spent my entire afternoon and I couldn't get it to work.
Imagine that I got the altitudinal range of different species. For
instance:
dat<-matrix(c(1,3,2.5,4), ncol=2, byrow=TRUE)
[,1] [,2]
[1,] 1.0 3
[2,] 2.5 4
The first line indicates that this species is found between 1 and 3,
whereas the second species was found between 2.5 and 4.
I need a simple way to calculate the overlap of their extents (0.5 in
case). This way should provide 0 if there is no overlap, and it should
also
work in the case where one subject is found only within the extent of
second subject.
Any help will be greatly appreciated.
Karla--
======================================================================
Stefano Leonardi
Dipartimento di Bioscienze
Universita` di Parma
Viale Usberti 11a Phone : +39-0521-905659
43124 PARMA (Italy) Fax : +39-0521-905402
Il mio photoblog: http://stefanoleonardi.wordpress.com
======================================================================
[[alternative HTML version deleted]]