Rのシェープファイルの行を削除する


12

シェープファイルをRにインポートし、テーブルに結合しました。シェープファイルには国勢調査IDがすべて含まれていますが、テーブルには選択した国勢調査IDのみが含まれています。私は今、すべての行を削除しようとしましたが、一致しませんでした。

これは私のデータセットのようです(NAですべての行を削除しようとしているので、最後の2つを削除する必要があります)。

  CTUID   Cluster   Average
5350007.01  1       124.53
5350007.02  1       234.87
5350010.01  4       110.11
5350010.02  5       187.68
5350001     NA        NA
5350002     NA        NA

私はこの行コードを使用してみました:

shape2[!(rowSums(is.na(shape2))==NCOL(shape2)),]

これは私にこのエラーを与えました:

Error in rowSums(is.na(shape2)) : 
  'x' must be an array of at least two dimensions
In addition: Warning message:
In is.na(shape2) : is.na() applied to non-(list or vector) of type 'S4'

私はRにあまり詳しくないので、どんな助けでも大歓迎です。あなたが素晴らしいだろう簡単な説明を含めることができれば。

回答:


13

エラーの有益な部分は、操作しているデータが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);


ご協力いただきありがとうございます!「一致」ではなく「マージ」を使用したため、空間結合を再編集しました。すべてのNA行を削除しましたが、シェイプをプロットするときにシェイプがシェイプファイルに残っています。なぜこれが起こっているのかについての考えはありますか?
ケリー

この答えの修正は、sp 1.0-15で必要です。spクラスオブジェクトが渡されると、sp固有のバージョンのmerge関数が呼び出されるようになりました。これは、1対1の一致を実行して行の次元を関連スロットと一致させると正しく実行されます。
ジェフリーエヴァンス14

7

パッケージの更新では、次のことをお勧めします。

shape <- shape[!is.na(shape@data$col),]

過去のバージョンでは、「形状」がdata.frameに強制されていました。sp開発者が標準のRメソッドの一部をspオブジェクトで機能させ始めているのは素晴らしいことです。この更新を提供してくれてありがとう。
ジェフリーエヴァンス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.