Легко назначайте и используйте значения данных 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 ...
...