Removendo linhas no shapefile em R

12

Importei um shapefile para o R e juntei-o a uma tabela. Meu shapefile contém todos os IDs do censo, enquanto minha tabela contém apenas os IDs selecionados. Agora estou tentando excluir todas as linhas que não obtiveram correspondência.

É assim que meu conjunto de dados se parece (estou tentando remover todas as linhas com NA, portanto, as duas últimas precisariam ser removidas):

  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

Eu tentei usar este código de linha:

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

O que me deu esse erro:

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'

Como não sou muito proficiente em R, qualquer ajuda seria muito apreciada. Se você pudesse incluir uma breve explicação, isso seria fantástico.

Kelly
fonte

Respostas:

13

A parte informativa do erro é que os dados nos quais você está operando são um objeto de classe S4 e, como tal, contêm slots. Isso significa que você precisa operar no slot "@data" apropriado que contém seu quadro de dados.

Se você deseja excluir "todas" as linhas com valores de NA, basta usar na.omit no slot do quadro de dados. Isso propaga através do objeto sp e remove os pontos / polígonos associados nos outros slots.

shape@data <- na.omit(shape@data)

Se você deseja remover linhas com NAs em uma coluna específica, você pode usar:

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

**** Atualização 03/08/2016 Agora existe uma função de mesclagem nativa que opera em objetos sp. Você pode chamar a mesclagem da mesma maneira que faria com qualquer outro data.frame. No entanto, o argumento x é um objeto de classe SpatailDataFrame sp e y é qualquer data.frame que você deseja mesclar. Estou deixando a resposta original para fins de referência.


Devo também salientar que você não pode usar a função de mesclagem para ingressar em um objeto sp. A função de mesclagem recorre aos dados durante a operação que interrompe o relacionamento interno no objeto sp. Infelizmente, isso é algo que não é amplamente divulgado. Para mesclar um quadro de dados ao slot @data de um objeto sp, você pode usar match dessa maneira.

shape@data = data.frame(shape@data, OtherData[match(sdata@data$IDS, OtherData$IDS),])

Onde; shape é seu arquivo de formas, IDS é o identificador no qual você deseja mesclar e OtherData é o dataframe que você deseja combinar com a forma. Observe que o IDS pode ter nomes diferentes nos dois conjuntos de dados, mas precisa realmente ter os mesmos valores (não difusos).

Como alternativa, você pode usar esta função.

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

Onde; x = objeto SpatialDataFrame, y = objeto de dataframe para mesclar com x, xcol = Mesclar o nome da coluna no objeto sp (é necessário citar), ycol = Mesclar o nome da coluna no objeto dataframe (é necessário citar).

Por alguma razão, não posso comentar sobre a pergunta @Kelly, por isso estou editando minha resposta original. Verifique qual versão do R e sp você está executando? Você pode executar SessionInfo () para descobrir. O comportamento de remover objetos associados nos outros slots de dados ao manipular o objeto @data só estava disponível nas duas últimas versões sp. Se não estiver executando uma versão atual, tente atualizar o pacote com "Atualizar pacotes" no menu de pacotes. Se estiver executando> = Windows Vista, certifique-se de executar como administrador. Observe também as dimensões do objeto antes e depois, ou seja, dim (shape), que representa o número de linhas / colunas. O número de linhas corresponde ao número de objetos de recurso. Você pode verificar os resultados com facilidade, verificando se o número de linhas no objeto espacial corresponde ao número de linhas no slot @data, ou seja, dim (shape);

Jeffrey Evans
fonte
Obrigado pela ajuda! Refiz a junção espacial porque usei uma 'mesclagem' em vez de 'correspondência'. Eu removi todas as linhas de NA, mas a forma ainda está presente no shapefile quando a planto. Alguma idéia de por que isso está acontecendo?
Kelly
Uma emenda a esta resposta é necessária no sp 1.0-15. Uma versão específica de sp da função de mesclagem agora é chamada, quando passada um objeto de classe sp, que é executado corretamente, desde que você execute uma correspondência de um para um para manter as dimensões da linha consistentes com os slots associados.
21414 Jeffrey Evans
7

Com as atualizações nos pacotes, sugiro o seguinte:

shape <- shape[!is.na(shape@data$col),]
WAF
fonte
Nas versões anteriores, isso teria resultado na "forma" ser coagida em um data.frame. É bom que os desenvolvedores sp estejam começando a fazer com que alguns dos métodos R padrão funcionem em objetos sp. Obrigado por fornecer esta atualização.
Jeffrey Evans