spatialpolygonをSpatialPolygonsDataFrameに変換し、属性テーブルに列を追加する方法


19
coast<-readShapeSpatial("coastline.shp")
landc<-readShapeSpatial("landcover.shp")
ro<-readShapeSpatial("roads.shp")
bc<-gBuffer(ro,width=100)
landc$ratings=1
landc$ratings[landc$LANDUSE_ID==4]=0 

上記では、4のカテゴリを取り上げ、新しい列に0を入力しています。

この時点で、私が指定したカラムたいratingsためだけでなくbc、それは外であれば、それはそれは、バッファ内にある場合は0を取り、1になります。問題があるということbcSpatialPolygons、それは属性テーブルが含まれていません。

明らかにSpatialPolygonオブジェクトに列を追加するにはSpatialPolygonsDataFrame、それをに変換する必要がありますが、その方法はわかりません。

私はこれを試しました:

buf_df<-as.data.frame(bc)
s_po<-SpatialPolygonsDataFrame(bc,buf_df)
s_po$ratings=0

しかし、このエラーはポップアップします:

row.names of data and Polygons IDs do not match 

1
gBufferのヘルプを読むと、byid = TRUEの場合、結果はSpatialPolygonsDataFrameであることがわかります。
ジェフリーエヴァンス

回答:


11

「海岸」、「ro」、および「bc」オブジェクトは、問題とどのような関係がありますか?問題は、「readShapeSpatial」を使用していることにある可能性があります。rgdalでreadOGRを試しましたか?ポリゴンシェープファイルを読み込んでいる場合、readOGRはSpatialPolygonsDataFrameオブジェクトになります。

実際、SpatialPolygonsオブジェクトがあり、SpatialPolygonsDataFrameに強制的に変換する場合は、指定されたデータフレームの行名がポリゴンスロットのポリゴンIDに一致する必要があります。以下に簡単な例を示します。

library(sp)

# create some SpatialPolygons with ID's "2" and "3"
( p <- SpatialPolygons(list(Polygons(list(Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))), "2"),
     Polygons(list(Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))), "3"))) )
class(p)    

# Create a dataframe and display default rownames
( p.df <- data.frame( ID=1:length(p)) ) 
rownames(p.df)

# Try to coerce to SpatialPolygonsDataFrame (will throw error)
p <- SpatialPolygonsDataFrame(p, p.df) 

# Extract polygon ID's
( pid <- sapply(slot(p, "polygons"), function(x) slot(x, "ID")) )

# Create dataframe with correct rownames
( p.df <- data.frame( ID=1:length(p), row.names = pid) )    

# Try coersion again and check class
 p <- SpatialPolygonsDataFrame(p, p.df)
 class(p) 

# Now we can add a column
p@data$ratings <- 1:2 

# Or modify an existing one
p[p$ID < 2 ,] <- 5

「coast」、「ro」、「bc」などの残りのコードを示して、私が一般的にやろうとしていることのアイデアを得られるようにしました。私は私が尋ねているもののより正確な答えを得る必要があり、より理解しやすくするために自分の変数を使用するのが賢明でしょう。「bc」には、新しい列を追加する必要があるspatialpolygonsオブジェクトであるroadsバッファーが含まれているため、最初にspatialPolygonsDataFrameに変換する必要があります。
gsa

10

試してください:

#Code taken from the question:
s_po <- SpatialPolygonsDataFrame(bc, buf_df, match.ID = F) 

match.ID 一致するポリゴンIDの行名の要件を回避します


4
反対しないでください、それは高く評価されていません!「複雑な」回答が提供された理由は、質問に対処した2015年に、強制メソッドでmatch.ID引数が使用できなかったためです。
ジェフリーエヴァンス

7

とても簡単です:

library("rgdal")
polygons <- readOGR('path_to/file.shp',
                      layer = 'file')
class(polygons)
>[1] "SpatialPolygonsDataFrame"
>attr(,"package")
>[1] "sp"

poly_df <- as.data.frame(polygons)
# do some staff with "poly_df" that doesn't support SpatialPolygonsDataFrame
# then convert it to SPDF back again
s_poly <- SpatialPolygonsDataFrame(polygons, poly_df)
# add new column to SPDF:
s_poly$new_column <- "some data" 

エラー:「データの行名とポリゴンIDが一致しない」が発生した場合、この解決策が役立つと思われます。データフレームのIDをポリゴンのIDに一致するように変更します。

newdata <- data.frame(whatever you want in here)
row.names(newdata) <- (however the new polygons are labeled)
polygons <- SpatialPolygonsDataFrame(polygons, newdata)

2
ここでいくつかの手順がわからない。この強制は疑わしいものです:as.data.frame(polygons)。この例では、オブジェクトを同じクラスに強制しています。さらに、実際の例では、データフレームの行名がポリゴンスロットのIDと一致しないため、エラーがスローされます。ポリゴンIDを取得し、強制する前にそれらを行名に割り当てる必要があります。
ジェフリーエヴァンス

@JeffreyEvans、これは作業コードからのコピーアンドペーストです。エラーなし、すべてが機能しています。SpatialPolygonsDataFrame作成方法に関するドキュメントを読んでください。
SS_Rebelious

4
ただし、この例ではreadOGRを使用しているため、SpatialPolygonsDataFrameから開始しており、元のspオブジェクトから取得したため、サブセットするデータフレームには既に正しい行名があります。ストローマンの例です。
ジェフリーエヴァンス

@JeffreyEvans、意味を明確にするために回答を編集しました。
SS_Rebelious

メイン投稿の最後の編集を参照して、間違ったことを教えてください。あなたのコメントに従って作成したと思いますが、エラーが発生します。独自の変数を使用して、よりわかりやすくします。ありがとう
-gsa

0

次の解決策が一般的に機能することがわかります。

最初に、IDをフィールドとして空のデータフレームを作成します。

df <- data.frame(ID=character(), stringsAsFactors=FALSE )

次に、空間ポリゴンのIDを取得しますbc

for (i in bc@polygons ) { df <- rbind(df, data.frame(ID=i@ID, stringsAsFactors=FALSE))  }
# and set rowname=ID
row.names(df) <- df$ID

次に、dfを空間データフレーム変換関数の2番目の引数として使用します。

spatial_df <- SpatialPolygonsDataFrame(bc, df)

ようdfspatial_dfデータフレームのオブジェクトであり、列は簡単に追加することができます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.