Suppression de lignes dans le fichier de formes dans R

12

J'ai importé un fichier de formes dans R et l'ai joint à une table. Mon fichier de formes contient tous les identifiants de recensement, tandis que ma table ne contient que les identifiants de recensement sélectionnés. J'essaie maintenant de supprimer toutes les lignes qui ne correspondent pas.

Voici à quoi ressemble mon ensemble de données (j'essaie de supprimer toutes les lignes avec NA, donc les deux dernières devraient être supprimées):

  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

J'ai essayé d'utiliser ce code de ligne:

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

Ce qui m'a donné cette erreur:

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'

Je ne suis pas très compétent en R, donc toute aide serait vraiment appréciée. Si vous pouviez inclure une brève explication, ce serait fantastique.

Kelly
la source

Réponses:

13

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);

Jeffrey Evans
la source
Merci de votre aide! J'ai refait la jointure spatiale parce que j'ai utilisé une «fusion» au lieu d'une «correspondance». J'ai supprimé toutes les lignes NA, mais la forme est toujours présente dans le fichier de formes lorsque je la trace. Avez-vous une idée de la raison pour laquelle cela se produit?
Kelly
Un amendement à cette réponse est nécessaire au sp 1.0-15. Une version spécifique à sp de la fonction de fusion est désormais appelée, lorsqu'elle reçoit un objet de classe sp, qui fonctionne correctement étant donné que vous effectuez une correspondance un à un pour garder les dimensions de la ligne cohérentes avec les emplacements associés.
Jeffrey Evans
7

Avec les mises à jour dans les packages, je suggère ce qui suit:

shape <- shape[!is.na(shape@data$col),]
WAF
la source
Dans les versions antérieures, cela aurait eu pour effet de contraindre "shape" dans un data.frame. C'est bien que les développeurs sp commencent à faire fonctionner certaines des méthodes R standard sur les objets sp. Merci d'avoir fourni cette mise à jour.
Jeffrey Evans