[R-sig-Geo] spsample random sampling a subset of polygons based on a variable from a different dataframe
Ross Dwyer
ross.dwyer at uq.edu.au
Wed Feb 27 05:45:44 CET 2013
Hi Kate,
It's always tough to decipher errors in code without the raw data to play around with. However I appreciate that the acoustic detection datasets can be huge (102656 in your case) and not easy to push around.
>From reading your code, I'm unsure why you need to run the for-loop on the 'myfun' function. Why don't you simply specify n = number of detections at that receiver as you did on the 'tester'? For-loops are computationally demanding and good to avoid when possible. This would would dramatically speed up the run-time and may fix your error.
If this doesn't work, try posting your data on something like http://www.filefactory.com/. You may get more responses on your query that way.
Cheers, Ross
Dr Ross Dwyer | University of Queensland | Email: ross.dwyer at uq.edu.au | http://www.uq.edu.au/eco-lab/ross-dwyer
-----Original Message-----
From: r-sig-geo-bounces at r-project.org [mailto:r-sig-geo-bounces at r-project.org] On Behalf Of kalee
Sent: Monday, 25 February 2013 12:38 PM
To: r-sig-geo at r-project.org
Subject: [R-sig-Geo] spsample random sampling a subset of polygons based on a variable from a different dataframe
Hi all,
Data background: I have a dataframe of fish telemetry locations where we have to estimate the X and Y co-ordinates based on the depth at which the fish is detected and the receiver number (combined into one attribute named 'RecDepth' within the dataframe; 20 fish each with 1,000-10,000 locations) .
I have a shapefile of the study area with the depth contours overlaided with the detection range of each receiver. The depth contours have an accuracy of
+/-2m so I have buffered each of these polylines to give me the possible
area into which fish detection could be (polygons: with a attribute of RecDepth that corresponds the the reciever number and depth of the contour).
The idea is to randomly select a point in each polygon corresponding to each fish detection and then pass the results to calculate the home-range and run
1000 iterations to see how much the home-range estimates differ.
Method and problem encountered: I now want to use spsample to randomly select a point within each polygons for each fish detection. I've tried to write a function to iterate through all the fish locations for each fish.
However, I'm having trouble with the function and I'm unsure why. I tried to use the method suggested at
http://casoilresource.lawr.ucdavis.edu/drupal/node/644 but I can't figure out how to select the correct polygons according the RecDepth in the dataframe.
Any help could be greatly appreciated.
Thanks
Kate
My code is as follows:
library(sp)
data1 <- read.csv("Blues_COA_breed.csv", header= TRUE)
str(data1)
##'data.frame': 102656 obs. of 9 variables:
## $ Date.Time: Factor w/ 56064 levels "1/08/2009 0:00",..: 40063 40064
40089 40100 40114 40119 40129 ##40134 40160 40166 ...
##$ ID : int 1 1 1 1 1 1 1 1 1 1 ...
## $ sex : Factor w/ 3 levels "female","male",..: 3 3 3 3 3 3 3 3 3 3
...
## $ sex_1 : int 3 3 3 3 3 3 3 3 3 3 ...
## $ RecDepth : int 608 608 608 608 508 608 608 608 606 606 ...
## $ Y : num -33.9 -33.9 -33.9 -33.9 -33.9 ...
## $ X : num 151 151 151 151 151 ...
## $ Z : int 8 8 8 8 8 8 8 8 6 6 ...
## $ Breeding : int 1 1 1 1 1 1 1 1 1 1 ...
#### Projection of shapefile is Australia Albers as follows:
PROJECTION <- CRS("+proj=aea +lat_1=-18 +lat_2=-36 +lat_0=0 +lon_0=134
+x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs")
BCARshp <-
readShapeSpatial("Reef_depth_detectionrange_Buffer4m_ALbers.shp",
proj4string = PROJECTION)
str(BCARshp)
##Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots
## ..@ data :'data.frame': 150 obs. of 6 variables:
## .. ..$ COMMENT : Factor w/ 1 level "Coogee Area": 1 1 1 1 1 1 1 1 1 1
...
## .. ..$ depth_islw: int [1:150] 2 2 2 2 2 2 2 8 8 16 ...
## .. ..$ Station : num [1:150] 2 3 5 6 7 8 9 4 5 8 ...
## .. ..$ Y : num [1:150] -3834217 -3834550 -3834729 -3834818
-3834753 ...
## .. ..$ X : num [1:150] 1765872 1765908 1765672 1765450 1765176
...
## .. ..$ RecDepth : num [1:150] 202 302 502 602 702 802 902 408 508 816 ...
## .. ..- attr(*, "data_types")= chr [1:6] "C" "N" "N" "N" ...
## ..@ polygons :List of 150
## .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots ## .. .. .. ..@ Polygons :List of 1 ## .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots ## .. .. .. .. .. .. ..@ labpt : num [1:2] 1765872 -3834217
## .. .. .. .. .. .. ..@ area : num 1200
## .. .. .. .. .. .. ..@ hole : logi FALSE
## .. .. .. .. .. .. ..@ ringDir: int 1 ## .. .. .. .. .. .. ..@ coords : num [1:164, 1:2] 1765898 1765898 1765897
1765897 1765897 ...
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] 1765872 -3834217
## .. .. .. ..@ ID : chr "0"
## .. .. .. ..@ area : num 1200
## .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots ## .. .. .. ..@ Polygons :List of 1 ## .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots ## .. .. .. .. .. .. ..@ labpt : num [1:2] 1765908 -3834550
## .. .. .. .. .. .. ..@ area : num 1572
## .. .. .. .. .. .. ..@ hole : logi FALSE
## .. .. .. .. .. .. ..@ ringDir: int 1 ## .. .. .. .. .. .. ..@ coords : num [1:221, 1:2] 1765883 1765882 1765882
1765882 1765882 ...
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] 1765908 -3834550
## .. .. .. ..@ ID : chr "1"
## .. .. .. ..@ area : num 1572
## .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots ## .. .. .. ..@ Polygons :List of 1 ## .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots ## .. .. .. .. .. .. ..@ labpt : num [1:2] 1765672 -3834729
## .. .. .. .. .. .. ..@ area : num 3334
## .. .. .. .. .. .. ..@ hole : logi FALSE
## .. .. .. .. .. .. ..@ ringDir: int 1 ## .. .. .. .. .. .. ..@ coords : num [1:494, 1:2] 1765498 1765498 1765498
1765498 1765498 ...
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] 1765672 -3834729
## .. .. .. ..@ ID : chr "2"
## .. .. .. ..@ area : num 3334
## .. .. [list output truncated]
## ..@ plotOrder : int [1:150] 78 55 62 48 69 5 56 3 67 44 ...
## ..@ bbox : num [1:2, 1:2] 1764709 -3835506 1766254 -3833973
## .. ..- attr(*, "dimnames")=List of 2 ## .. .. ..$ : chr [1:2] "x" "y"
## .. .. ..$ : chr [1:2] "min" "max"
## ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slots ## .. .. ..@ projargs: chr "+proj=aea +lat_1=-18 +lat_2=-36 +lat_0=0
+lon_0=134 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m
+no_defs"
class(BCARshp)
##[1] "SpatialPolygonsDataFrame"
##attr(,"package")
##[1] "sp"
## starting with just fish ID 1
fish1 <- data1[data1$ID == 1, 5]
str(fish1)
## int [1:8185] 608 608 608 608 508 608 608 608 606 606 ...
d <- as.data.frame(fish1)
myfun <- function(d, k) {
BCARfish <- BCARshp[BCARshp$RecDepth == d[k,],]
fish <- spsample(BCARfish, n = 1, type = "random", proj4string = PROJECTION, iter= 10)
xco <- fish at coords[[1]]
yco<- fish at coords[[2]]
xy <- cbind(xco, yco)
return(xy)
}
fishdet <- rep(0, nrow(d))
for (j in 1:length(fishdet)) fishdet[j] <- myfun(d, j)
## ERROR I'M RECEIVING
Error in if (is.numeric(i) && i < 0) { :
missing value where TRUE/FALSE needed
In addition: There were 27 warnings (use warnings() to see them)
z <- as.matrix(d)
m <- dimnames(z)
l <-list(m[[1]], xy)
write.csv(l, file = paste("fish1_randpoint_test.csv"), row.names = F)
traceback()
12: stop("arguments imply differing number of rows: ", paste(unique(nrows),
collapse = ", "))
11: data.frame(NULL, c(1765491.27849468, -3834819.10145441), check.names = FALSE,
stringsAsFactors = TRUE)
10: eval(expr, envir, enclos)
9: eval(as.call(c(expression(data.frame), x, check.names = !optional,
stringsAsFactors = stringsAsFactors)))
8: as.data.frame.list(x[[i]], optional = TRUE, stringsAsFactors =
stringsAsFactors)
7: as.data.frame(x[[i]], optional = TRUE, stringsAsFactors =
stringsAsFactors)
6: data.frame(x)
5: write.table(l, file = paste("fish1_randpoint_test.csv"), row.names = F,
col.names = TRUE, sep = ",", dec = ".", qmethod = "double")
4: eval(expr, envir, enclos)
3: eval(expr, p)
2: eval.parent(Call)
1: write.csv(l, file = paste("fish1_randpoint_test.csv"), row.names = F)
#### When I ran the following as a tester it worked ok
BCARfish608 <- BCARshp[BCARshp$RecDepth == 608,]
fish608 <- spsample(BCARfish608, n = 10, type = "stratified", proj4string =
PROJECTION)
x_3 <- fish608 at coords[[1]]
y_3 <- fish608 at coords[[2]]
xy3 <- cbind(x_3, y_3)
BCARfish426 <- BCARshp[BCARshp$RecDepth == 426,]
fish426 <- spsample(BCARfish426, n = 10, type = "stratified", proj4string =
PROJECTION)
x_4 <- fish426 at coords[[1]]
y_4 <- fish426 at coords[[2]]
xy4 <- cbind(x_4, y_4)
BCARfish408 <- BCARshp[BCARshp$RecDepth == 408,]
fish408 <- spsample(BCARfish408, n = 10, type = "stratified", proj4string =
PROJECTION)
x_5 <- fish408 at coords[[1]]
y_5 <- fish408 at coords[[2]]
xy5 <- cbind(x_5, y_5)
fish <- rbind(xy1, xy2, xy3, xy4, xy5)
### the code for my home-range analysis would then be (this normally works
fine)
H.s <- Hpi(xy, binned = TRUE)
KDE <- kde(xy, H=H.s, binned = TRUE)
cont <- contourSizes(KDE, cont = c(95), approx = TRUE)
return(cont)
## plot of shapefile is attached
plot(BCARshp)
<http://r-sig-geo.2731867.n2.nabble.com/file/n7582766/BCARshp_plot.png>
--
View this message in context: http://r-sig-geo.2731867.n2.nabble.com/spsample-random-sampling-a-subset-of-polygons-based-on-a-variable-from-a-different-dataframe-tp7582766.html
Sent from the R-sig-geo mailing list archive at Nabble.com.
_______________________________________________
R-sig-Geo mailing list
R-sig-Geo at r-project.org
https://stat.ethz.ch/mailman/listinfo/r-sig-geo
More information about the R-sig-Geo
mailing list