La partie informative de l'erreur est que les données sur lesquelles vous travaillez sont un objet de classe S4 et en tant que telles contiennent des emplacements. Cela signifie que vous devez opérer sur l'emplacement approprié "@data" contenant votre trame de données.
Si vous souhaitez supprimer "toutes" les lignes avec des valeurs NA, vous pouvez simplement utiliser na.omit sur l'emplacement de trame de données. Cela propgate à travers l'objet sp et supprime les points / polygones associés dans les autres emplacements.
shape@data <- na.omit(shape@data)
Si vous souhaitez supprimer des lignes contenant des NA dans une colonne spécifique, vous pouvez utiliser:
shape@data <- shape[!is.na(shape@data$col) ,]
**** Mise à jour 03/08/2016 Il existe maintenant une fonction de fusion native qui fonctionne sur les objets sp. Vous pouvez appeler la fusion de la même manière que vous le feriez avec n'importe quel autre data.frame. Cependant, l'argument x est un objet de classe Sp SpatailDataFrame et y est tout data.frame que vous souhaitez fusionner. Je laisse la réponse originale à des fins de référence.
Je dois également souligner que vous ne pouvez pas utiliser la fonction de fusion pour rejoindre un objet sp. La fonction de fusion recourt aux données pendant l'opération, ce qui rompt la relation interne dans l'objet sp. C'est quelque chose qui, malheureusement, n'est pas largement annoncé. Pour fusionner une trame de données à l'emplacement @data d'un objet sp, vous pouvez utiliser match de cette manière.
shape@data = data.frame(shape@data, OtherData[match(sdata@data$IDS, OtherData$IDS),])
Où; shape est votre fichier shape, IDS est l'identifiant sur lequel vous souhaitez fusionner et OtherData est le dataframe que vous souhaitez combiner avec shape. Notez que IDS peut avoir des noms différents dans les deux jeux de données mais doit en fait avoir les mêmes valeurs (pas floues).
Vous pouvez également utiliser cette fonction.
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)
}
Où; x = sp objet SpatialDataFrame, y = objet de trame de données à fusionner avec x, xcol = nom de la colonne de fusion dans l'objet sp (besoin de citer), ycol = nom de la colonne de fusion dans l'objet de trame de données (besoin de citer).
Pour une raison quelconque, je ne peux pas commenter la question @Kelly, je modifie donc ma réponse d'origine. Vérifiez quelle version de R et sp utilisez-vous? Vous pouvez exécuter SessionInfo () pour le savoir. Le comportement de suppression des objets associés dans les autres emplacements de données lors de la manipulation de l'objet @data n'est disponible que dans les dernières versions de sp. Si vous n'exécutez pas une version actuelle, essayez de mettre à jour le package avec "Mettre à jour les packages" dans le menu des packages. Si vous exécutez> = Windows Vista, assurez-vous d'exécuter en tant qu'administrateur. Regardez également les dimensions de votre objet avant et après, c'est-à-dire dim (forme), qui représente le nombre de lignes / colonnes. Le nombre de lignes correspond au nombre d'objets d'entité. Vous pouvez vérifier les résultats en vérifiant si le nombre de lignes dans l'objet géographique correspond au nombre de lignes dans l'emplacement @data, c'est-à-dire dim (forme);
Avec les mises à jour dans les packages, je suggère ce qui suit:
la source