0

ポリゴン シェイプ ファイルと一連のデータ フレームがあります。私がやりたいことは、シェイプ ファイルとそれらすべてのデータ フレームの間で「空間結合」を行うループを作成することですが、エラーが発生し続けます。これに関するアイデアはありますか?

これが私のループのコードです

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

以下は、3 つのステップで再現可能な例です。

(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 
    gridpolygon@data$id = rownames(gridpolygon@data)    
    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

空間結合を 1 つずつ行うと正しい結果が得られますが、データ セットが多すぎるため、これでは問題は解決しません。

# 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) 
4

1 に答える 1

0

これは、コメントで @NicE によって提案されたソリューションです。ループ内のget(i)代わりに使用するだけの問題です。i

  for (i in datasets){
    gridpolygon <- sp::merge(gridpolygon, get(i), by = "id", sort = FALSE)
  }
于 2016-05-02T22:09:01.427 に答える