2015-09-30 6 views
0

Ниже у меня есть набор точек с местоположениями и атрибутами. Я одна проблема:Принимая случайную точку из списка точек на квадрат сетки

атр не передается в конечный point_grid_loc

Во-вторых, то, что я хочу делать делать дальше, возьмите 1 случайную точку из каждой сетки и вернуть его в качестве data.frame или SpatialPointDataFrame из точки.

Борясь с тем, как подойти к нему:

# Install libraries 
library(sp) 
library(gstat) 

# Set seed for reproducible results 
set.seed = 34 
x <- c(5.9,6.5,7.1,3.1,5.6,8.1,6.3,5.8,2.1,8.8,5.3,6.8,9.9,2.5,5.8,9.1,2.4,2.5,9.2) 
y <- c(3.6,6.5,5.4,5.2,1.1,5.1,2.7,3.8,6.07,4.4,7.3,1.8,9.2,8.5,6.8,9.3,2.5,9.2,2.5) 
attr <- c(23,56,2,34,7,89,45,34,2,34,5,67,8,99,6,65,3,32,12) 
initialdata <- data.frame(x,y,attr) 
colnames(initialdata) <- c("x","y","attr") 

# Creating SpatialPointDataFrame: 
coords <- data.frame(initialdata$x,initialdata$y) 
coords <- SpatialPoints(coords, proj4string=CRS(as.character(NA)), bbox = NULL) 
initialdata_DF <- data.frame(coords,initialdata$attr) 
initialdata_SPDF <- SpatialPointsDataFrame(coords,initialdata_DF) 

#==============# 
cellsize <- 3 
#==============# 

# Creating a grid which will constitute a mesh for stratified sampling 
# Info how to include CSR p. 50 yellow book 
bb<- bbox(coords) 
cs <- c(cellsize,cellsize) 
cc <- bb[,1] + (cs/2) 
cd <- ceiling(diff(t(bb))/cs) 
initialdata_grd <- GridTopology(cellcentre.offset = cc, cellsize = cs, 
           cells.dim = cd) 
initialdata_SG <- SpatialGrid(initialdata_grd) # Final grid created here 

# Plot the results: 
plot(initialdata_SG) 
plot(initialdata_SPDF, add=T,col="blue", pch="+") 

# Create a polygon: 
poly <- as.SpatialPolygons.GridTopology(initialdata_grd) 

# Identifies which point is in which grid/polygon location: 
point_grid_loc <- data.frame(initialdata_SG,grid=over(initialdata_SPDF,poly)) 

ответ

2

Я думаю, что вы работаете в неприятность на последний шаг, потому что вы вызываете неправильный объект. Если вы хотите добавить расположение сетки для ваших пространственных данных, попробуйте:

initialdata_SPDF$grid <- over(initialdata_SPDF, poly) 

Чтобы сделать часть выборки, вы можете использовать раскол/применить/объединить подход, например:

# Split the spatial data into a list of data frames by grid location 
gridlist <- split(initialdata_SPDF, initialdata_SPDF$grid) 
# Sample one row from each data frame (grid cell) in the resulting list; see sample() help for details on that part 
samples <- lapply(gridlist, function(x) x[sample(1:nrow(x), 1, FALSE),]) 
# Bind those rows back together in a new data frame 
sampledgrid <- do.call(rbind, samples) 
+0

Фантастические и так лаконично, ваша помощь очень ценится! – MIH

+0

У меня есть еще один вопрос. В строке образцы <- lapply (gridlist, function (x) x [sample (1: nrow (x), 1, FALSE),]) , если я заменяю 1 образец на 2, R возвращает сообщение: Ошибка в sample.int (x, size, replace, prob): не может взять образец, превышающий совокупность, когда «replace = FALSE» Я хочу сделать выборку без замены, и кажется, что для размера выборки 1 у нее не было когда никакие точки не лежали внутри квадрата сетки. Какие-нибудь догадки, как это сделать, чтобы сделать это возможным? То есть. для размера выборки = 2, если в сетке есть 1 образец, тогда просто верните 1 пункт или ничего, если в нем ничего нет. – MIH

+1

Вы должны иметь возможность обрабатывать это с помощью структуры 'if' и' else' в функции, которую вы используете в вызове 'lapply()', например, 'lapply (gridlist, function (x) if (nrow (x) > 1) {x [sample (1: nrow (x), 2, FALSE),]} else {x [sample (1: nrow (x), 1, FALSE),]}) '. – ulfelder

 Смежные вопросы

  • Нет связанных вопросов^_^