Eu criei um objeto do tipo SpatialPointsDataFrame
usando o sp
pacote em R. No entanto, estou confuso sobre os @, $, . and []
operadores e quando usá-los para acessar as diferentes propriedades do meu objeto. Aqui está o meu código de exemplo:
library(sp)
library(rgdal)
#creating a SpatialPointsDataFrame with sample points in UTM
x <- c(15.2, 15.3, 15.4, 15.5, 15.7)
y <- c(50.4, 50.2, 50.3, 50.1, 50.4)
v1 <- c(1.0, 2.0, 3.0, 4.0, 5.0)
v2 <- c("a","b","b","c","a")
attributes <- as.data.frame(cbind(v1,v2))
xy <- cbind(x,y)
locationsDD <- SpatialPointsDataFrame(xy, attributes)
proj4string(locationsDD) <- CRS("+proj=longlat")
locations <- spTransform(locationsDD, CRS("+proj=utm +zone=33"))
plot(locations)
#using the different operators: WHEN TO USE @, $ or [] ?
#all these work!
property1 <- locations$v1
property2 <- locations@data$v1
property3 <- locations@data[,"v1"]
property4 <- locations@data["v1"]
#these also work
property5 <- locations@coords
property6 <- locations@bbox
property7 <- locations@coords[,2]
#these three work only in my special case
property8 <- locations@coords[,"y"]
property9 <- locations$x
property10 <- locations$y
#these don't work: $ operator is invalid for atomic vectors
property11 <- locations@coords$x
property12 <- locations@coords$y
Alguém poderia me ajudar, quando usar os @, $, []
operadores? Quando eu tento ler a documentação ?SpatialPointsDataFrame
que eu posso ver as diferentes propriedades, tais como coords
ou bbox
mas estou confuso qual operadora @, $, []
usar para acessar los ou modificá-los.
R
sintaxe, ela não é específica para osp
pacote ou seus objetos.R
está instalado com um tutorial: comece aí em sua pesquisa. A Web e a mídia impressa oferecem uma riqueza de recursos adicionais para o aprendizadoR
.Respostas:
Os dados espaciais sp são objetos da classe S4 e são compostos de slots (chamados usando @) que contêm componentes da classe de recurso espacial que está sendo representada (por exemplo, @data contém atributos, @coords contêm pares de coordenadas, etc ...). Você pode retornar os nomes dos slots de nível superior usando slotNames (), mas não é recursivo e não retornará nomes de slots aninhados para objetos de classe de polígono. Cada slot pode conter uma classe de objeto diferente e, antes de operar nele, deve ser verificado usando str () ou class (). O slot @data é sempre um objeto data.frame e @coords é uma matriz, enquanto @polygons é um objeto de lista com slots adicionais (labpt, área, furo, ringDir e cordas).
Os slots disponíveis e a organização deles dependem de que tipo de classe de recurso está sendo representado. Os objetos SpatialPointsDataFrame são os mais básicos, enquanto os objetos SpatialPolygonsDataFrame têm aninhamento (como visto acima). Essa estrutura aninhada, representando cada polígono, deve ser considerada usando algo como sapply para operar em cada objeto da lista (polígono).
Aqui está um exemplo que usa sapply para retornar a área de cada polígono iterando pelos "polígonos" e depois pelos slots "área" aninhados.
No caso de objetos de polígono, uma vez que eles são armazenados como uma lista para cada polígono, você também pode usar a indexação de lista. Aqui está um exemplo para retornar o primeiro polígono (resultando em um objeto de classe "Polígono" e não SpatialPolygonsDataFrame):
Nas versões mais recentes do sp, os desenvolvedores começaram, em alguns casos, removendo a necessidade de chamar o slot @data diretamente.
Por exemplo, para indexar @ dados você anteriormente:
e agora:
No entanto, como indicado anteriormente, este não é o caso dos outros slots (por exemplo, coordenadas, polígonos, etc ...). Quanto a quando usar [] ou $, isso ainda depende do tipo de operação. Os colchetes "[]" podem ser usados para chamar um nome em um quadro de dados, mas são usados principalmente para indexação, enquanto $ é usado especificamente para chamar uma coluna em um quadro de dados. O motivo pelo qual uma chamada "indireta" para um nome de coluna funciona é que os desenvolvedores adicionaram funcionalidade para permitir uma pesquisa recursiva através do objeto sp. No entanto, para evitar conflitos de nome (como no seu exemplo; ter colunas x, y no seu quadro de dados entraria em conflito com os nomes x, y nos nomes da matriz @coord), há alguma verificação de consistência interna que explica por que isso funciona apenas em alguns casos. instâncias.
Uma característica conveniente é que você pode subconjunto de um objeto espacial por meio de um índice de linha. Aqui estou subconjunto dos 10 primeiros objetos.
Ou, alternativamente, uma amostra aleatória (n = 10) usando um vetor de índice de linha.
Compreender a indexação e como usar colchetes é uma coisa muito importante na escrita do código R.
Editar (24/03/2017): Observe que a classe de recurso simples (sf), seguindo o padrão GeoJSON, provavelmente se tornará o novo padrão para objetos espaciais em R. Você pode ler uma descrição detalhada dessa classe no CRAN sf website simples caracteriza por R .
fonte
SpatialPointsDataFrame
não apenas as colunas @data, mas também as colunas @coords podem ser recuperadas com o$
operador sem a necessidade de chamar o slot @coords. Então,sdat@coords$easting
dá o mesmo resultado quesdat$easting
.colnames(locations@coords)
retorna[1] "x" "y"
mascolnames(locations@data)
retorna[1] "v1" "v2"
. Talvez o comportamento dependa de qual função foi usada para criar o SpatialPointsDataFrame?sdat@coords$easting
não funciona porque sdat @ coords é uma matriz. Massdat@coords[,"easting"]
é equivalente asdat@coords[,1]
e parasdat$easting
.Você deve tentar
str(locations)
esclarecer isso.por exemplo, estes estão corretos:
E este
property1 <- locations$v1
funciona, porque está fazendo referência ao data.frame dentro da localização, @datafonte
str(locations)
me deu algumas boas dicas. Agora eu entendo que@
é usado para "slot de uma classe". Mas eu ainda não entendo por queproperty9 <- locations$x
funciona quandonames(locations)
não contém qualquer coluna chamadax
SpatialPointsDataFrame
objeto usa para acessar as coordenadas com o$
operador. Mas pelo menos estou mais confortável em usá-lo agora. Executei o seguinte código:colnames(locations@coords) <- c("easting","northing")
Depois de executá-lo,locations$easting
o vetor da coordenada x e o vetor da coordenadalocations$northing
y.@coords
matriz daSpatialPointsDataFrame
depende de como oSpatialPointsDataFrame
objeto foi criado. Método 1:coordinates(sdat) <- x ~ y
renomeie as colunas para"coords.x1", "coords.x2"
. Método dois:sdat <- SpatialPointsDataFrame(xy, attributes)
preservará os nomes das colunas originais daxy
matriz.