Пространственные sp-данные являются объектами класса S4 и состоят из слотов (называемых с помощью @), которые содержат компоненты представляемого класса пространственных объектов (например, @data содержит атрибуты, @coords содержат пары координат и т. Д.). Вы можете вернуть имена слотов верхнего уровня с помощью slotNames (), но они не являются рекурсивными и не будут возвращать имена вложенных слотов для объектов класса многоугольника. Каждый слот может содержать свой класс объектов, и, прежде чем работать с ним, его следует проверить с помощью str () или class (). Слот @data всегда является объектом data.frame, а @coords - матрицей, тогда как @polygons является объектом списка с дополнительными слотами (labpt, area, hole, ringDir и координаты).
Доступные слоты и их организация зависят от того, какой тип класса объектов представлен. Объекты SpatialPointsDataFrame являются наиболее основными, тогда как объекты SpatialPolygonsDataFrame имеют вложенность (как показано выше). Эта вложенная структура, представляющая каждый многоугольник, должна учитываться с использованием чего-то вроде sapply для работы с каждым объектом списка (многоугольником).
Вот пример, который использует sapply, чтобы вернуть площадь для каждого многоугольника, итерируя по «многоугольникам», а затем по вложенным слотам «области».
sapply(slot(sdat, 'polygons'), function(i) slot(i, 'area'))
В случае объектов многоугольника, поскольку они хранятся в виде списка для каждого многоугольника, вы можете альтернативно использовать индексацию списка. Вот пример возврата первого многоугольника (в результате получается объект класса «Polygon», а не SpatialPolygonsDataFrame):
sdat@polygons[[1]]
В более поздних версиях sp разработчики начали, в некоторых случаях, устраняя необходимость прямого вызова слота @data.
Например, для индексации @data вы ранее:
sdat@data[sdat@data$att >= 0.5 ,]
и сейчас:
sdat[sdat$att >= 0.5 ,]
Однако, как указывалось ранее, это не относится к другим слотам (например, координатам, полигонам и т. Д.). Что касается того, когда использовать [] или $, это все еще зависит от типа операции. Скобки «[]» могут использоваться для вызова имени в кадре данных, но в основном используются для индексации, тогда как $ специально используется для вызова столбца в кадре данных. Причина, по которой работает «косвенный» вызов имени столбца, заключается в том, что разработчики добавили функциональность, позволяющую осуществлять рекурсивный поиск по объекту sp. Однако, чтобы избежать конфликтов имен (как в вашем примере; наличие столбцов x, y в вашем кадре данных будет конфликтовать с именами x, y в именах матрицы @coord), существует некоторая внутренняя проверка согласованности, объясняющая, почему это работает только в некоторых экземпляров.
Одна удобная характеристика заключается в том, что вы можете подмножество пространственного объекта через индекс строки. Здесь я подгруппирую первые 10 объектов.
sub.sdat <- sdat[1:10,]
Или, альтернативно, случайная выборка (n = 10) с использованием вектора индекса строки.
rs.sdat <- sdat[sample(1:nrow(sdat), 10),]
Понимание индексации и использования скобок - очень важная вещь при написании кода на языке R.
Редактирование (24.03.2017): Обратите внимание, что класс простых объектов (sf), следуя стандарту GeoJSON, скорее всего, станет новым стандартом для пространственных объектов в R. Подробное описание этого класса можно прочитать на сайте CRAN sf. сайт Простой Возможности для R .
R
синтаксиса, он не относится кsp
пакету или его объектам.R
устанавливается с помощью учебника: начните с исследования. Сеть и печатные СМИ предлагают множество дополнительных ресурсов для обученияR
.