2015-08-11 14 views
0

У меня есть файл формы многоугольника и ряд кадров данных. То, что я хочу сделать, заключается в создании цикла, который сделает «пространственную связь» между файлом формы и всеми этими кадрами данных, но я все равно получаю сообщение об ошибке. Есть идеи по этому поводу?Использование Loop для создания пространственного соединения между шейп-файлом и фреймами данных

Вот код моего цикла

datasets <- c("df1","df2","df3") 

for (i in datasets){ 
    gridpolygon <- sp::merge(gridpolygon, i, by = "id", sort = FALSE) #Spatial Join 
    } 

> Error in table(y[, by.y]) : attempt to set an attribute on NULL 

Вот воспроизводимый пример в три этапа.

(1) Создание регулярного географической привязки многоугольника из случайного многоугольника

# Load libraries 
library(sp) 
library(rgdal) 
library(rgdal) 
library(raster) 
library(rgeos) 
library(dismo) 
library(data.table) 

### create a regular gridded polygon from a random polygon 

# create polygon Random Polygon 
    set.seed(1) 
    dat <- matrix(stats::rnorm(2000), ncol = 2) 
    ch <- chull(dat) 
    coords <- dat[c(ch, ch[1]), ] # closed polygon 
    sp_poly <- SpatialPolygons(list(Polygons(list(Polygon(coords)), ID=1))) 
    plot(sp_poly) 

# create a regular gridded polygon 
    # Create an empty raster 
    grid <- raster(extent(sp_poly)) 

    # Choose its resolution. 
    res(grid) <- 1 

    # coordinate reference system 
    proj4string(grid)<-CRS("++proj=utm +zone=48") # set it to UTM 

    # Transform this raster into a polygon 
    gridpolygon <- rasterToPolygons(grid) 

    # Create and ID variable of Grid Cells 
    [email protected]$id = rownames([email protected])  
    plot(gridpolygon) 

(2) Создание фреймов данных

df1 <- data.table(id=seq(1:5), x=c(11:15)) 
    df2 <- data.table(id=seq(1:5), y=c(21:25)) 
    df3 <- data.table(id=seq(1:5), z=c(31:35)) 

(3) Попытка петля

datasets <- c("df1","df2","df3") 

for (i in datasets){ 
    gridpolygon <- sp::merge(gridpolygon, i, by = "id", sort = FALSE) #Spatial Join 
    } 

> Error in table(y[, by.y]) : attempt to set an attribute on NULL 

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

# Spatial join, one by one 
    gridpolygon <- sp::merge(gridpolygon, df1, by = "id", sort = FALSE) 
    gridpolygon <- sp::merge(gridpolygon, df2, by = "id", sort = FALSE) 
    gridpolygon <- sp::merge(gridpolygon, df3, by = "id", sort = FALSE) 
+2

попробовать 'получить (я)' вместо 'i' в цикле, это будет получить dataframe в то время как' i' это только символы «df1» – NicE

+0

Спасибо @NicE! Это была такая простая ошибка! спасибо, еще раз. –

ответ

0

Это решение, предлагаемое @NicE в комментариях. Это просто вопрос использования get(i) вместо i внутри цикла.

for (i in datasets){ 
    gridpolygon <- sp::merge(gridpolygon, get(i), by = "id", sort = FALSE) 
    }