エラーの有益な部分は、操作しているデータがS4クラスオブジェクトであり、スロットが含まれていることです。これは、データフレームを含む適切なスロット「@data」で操作する必要があることを意味します。
NA値を持つ「すべての」行を削除する場合は、データフレームスロットでna.omitを使用できます。これにより、spオブジェクトが伝搬され、他のスロット内の関連するポイント/ポリゴンが削除されます。
shape@data <- na.omit(shape@data)
特定の列のNAを含む行を削除する場合は、次を使用できます。
shape@data <- shape[!is.na(shape@data$col) ,]
**** 2016年3月8日更新spオブジェクトを操作するネイティブマージ関数があります。他のdata.frameと同じ方法でmergeを呼び出すことができます。ただし、x引数はsp SpatailDataFrameクラスオブジェクトであり、yはマージするdata.frameです。参考のために元の回答を残しています。
また、マージ関数を使用してspオブジェクトに結合することはできないことも指摘する必要があります。マージ関数は、操作中にデータを再利用して、spオブジェクトの内部関係を破壊します。これは、残念ながら広く宣伝されていないものです。データフレームをspオブジェクトの@dataスロットにマージするには、この方法でmatchを使用できます。
shape@data = data.frame(shape@data, OtherData[match(sdata@data$IDS, OtherData$IDS),])
どこ; shapeはシェイプファイル、IDSはマージする識別子、OtherDataはシェイプと結合するデータフレームです。IDSは2つのデータセットで異なる名前にすることができますが、実際には同じ値にする必要があります(ファジーではない)。
または、この関数を使用できます。
join.sp.df <- function(x, y, xcol, ycol) {
x$sort_id <- 1:nrow(as(x, "data.frame"))
x.dat <- as(x, "data.frame")
x.dat2 <- merge(x.dat, y, by.x = xcol, by.y = ycol)
x.dat2.ord <- x.dat2[order(x.dat2$sort_id), ]
x2 <- x[x$sort_id %in% x.dat2$sort_id, ]
x2.dat <- as(x2, "data.frame")
row.names(x.dat2.ord) <- row.names(x2.dat)
x2@data <- x.dat2.ord
return(x2)
}
どこ; x = sp SpatialDataFrameオブジェクト、y = xとマージするデータフレームオブジェクト、xcol = spオブジェクトの列名のマージ(引用が必要)、ycol =データフレームオブジェクトの列名のマージ(引用が必要)。
何らかの理由で、@ Kellyの質問にコメントできないため、元の回答を編集しています。実行しているRとspのバージョンを確認しますか?SessionInfo()を実行して確認できます。@dataオブジェクトを操作するときに他のデータスロットにある関連オブジェクトを削除する動作は、最後のカップルのspバージョンでのみ利用可能です。現在のバージョンを実行していない場合は、パッケージメニューの[パッケージの更新]でパッケージを更新してください。> = Windows Vistaを実行している場合は、必ず管理者として実行してください。また、オブジェクトの前後の次元、つまり行/列の数を表すdim(shape)も見てください。行の数は、フィーチャオブジェクトの数に対応します。空間オブジェクトの行数が@dataスロットの行数と一致するかどうかを確認することにより、結果を確認できます。つまり、dim(shape);