Легко назначайте и используйте значения данных Spatial*DataFrame

Можно ли как-то легко работать с данными в Spatial*DataFrame (* = Точки, Линии, Полигоны, Пиксели, Сетка,...)? В частности, у меня возникают трудности с присвоением ему значений и оперированием ими:

require(gstat)
data(meuse)
coordinates(meuse) = ~x+y
data(meuse.grid)
gridded(meuse.grid) = ~x+y

######## 1) assigning value

meuse[1,'zinc'] <- NA
# Error in meuse[1, "zinc"] <- NA : object of type 'S4' is not subsettable
as.data.frame(meuse)[1,'zinc'] <- NA
# Error in as.data.frame(meuse)[1, "zinc"] <- NA : 
#   could not find function "as.data.frame<-"

######## 2) operating with values

meuse[, 'zinc'] + 2
# Error in meuse[, "zinc"] + 2 : non-numeric argument to binary operator

Я нашел довольно уродливые обходные пути для обоих случаев:

# ad 1)
meuse2 <- as.data.frame(meuse)
meuse2[1, 'zinc'] <- NA
meuse2 <- SpatialPointsDataFrame(SpatialPoints(meuse), meuse2)

# ad 2)
as.data.frame(meuse)[, 'zinc'] + 2

но это всего лишь попытки новичков, слишком уродливые и сложные... Должно быть, гораздо проще в R!

2 ответа

Вы можете сделать это так:

meuse$zinc[1] <- NA 

или лучше, поскольку вы можете использовать имя переменной, а не литерал:

aname <- 'zinc'
meuse[[aname]][1] <- NA

Кажется, что другие пути к этому не предоставлены как методы, но они могут быть добавлены. Я не уверен, почему это так, но изначально *DataFrame часть была построена как AttributeList в sp так как R фактический data.frame в то время было неэффективно с именами строк, но это древняя история и все исправлено сейчас.

Вы могли ожидать, что они будут работать, как нормальный data.frame но они не

meuse[1,'zinc'] <- NA
meuse[1,][['zinc']] <- NA
meuse[1,]$zinc <- NA 

Вероятно, лучше избегать оператора @, если вы можете, потому что разработчики должны скрывать внутри кода, который они предоставляют пользователям, то есть это подрывает их API, если вы не используете предоставленные методы. В этом нет никакой серьезной опасности, за исключением того, что разработчики могут изменить API, и ваш код не будет работать, и вы можете испортить объект, изменив одну часть, а не другую так, как проектировался объект, поэтому вам не следует использовать кроме как в частном порядке или в коде, который вы активно поддерживаете (я думаю, что в этом случае это безопасно, но обычно избегайте этого, если можете). Видите?"@" И "слот" для основ.

Для объектов Spatial*DataFrame вы можете получить доступ к слоту data.frame с помощью @data, и обычные операции data.frame должны работать. Используя ваш пример,

 meuse@data[1, 'zinc'] <- NA

дает

 str(meuse@data)
'data.frame':   155 obs. of  12 variables:
 $ cadmium: num  11.7 8.6 6.5 2.6 2.8 3 3.2 2.8 2.4 1.6 ...
 $ copper : num  85 81 68 81 48 61 31 29 37 24 ...
 $ lead   : num  299 277 199 116 117 137 132 150 133 80 ...
 $ zinc   : num  NA 1141 640 257 269 ...
 ...
Другие вопросы по тегам