我试图找到我创建的SpatialPointsDataFrame的质心。以下是名为" spdf"。
的数据框的片段 Name X Y
1 16 56 39
2 16 57 39
3 16 55 38
4 16 55 37
5 16 54 38
6 16 55 39
7 16 55 40
8 12 58 41
9 12 56 45
10 12 58 43
11 12 56 42
12 12 55 44
13 12 55 47
我正在使用" gCentroid"来自" rgeos"用于识别质心的包。我可以使用gCentroid(spdf, byid = FALSE)
计算整个数据框的质心,但是当我尝试根据" Name"来计算质心时,我会收到错误。使用gCentroid(spdf, byid = TRUE, id = "Name")
的字段。换句话说,基于以上数据,我希望获得名称的两个质心" 12"和" 16"。关于gCentroid的文档很少关于" id"领域。有没有人对如何为每个" Name"?
答案 0 :(得分:4)
文档稍有混淆,但您没有指定ID输入,而是指定输出。示例中的每个点都有自己的ID(数据框的rownames,根据定义,它必须是唯一的)。然而,您可以通过df$Name
中的唯一值对数据框进行子集化并以这种方式计算质心来轻松获得所需的输出...
ctrs <- lapply( unique( df$Name ) , function(x) gCentroid( SpatialPoints( df[ df$Name == x , c('X','Y') ] ) ) )
setNames( ctrs , unique(df$Name ) )
#$`16`
#SpatialPoints:
# x y
#1 55.28571 38.57143
#Coordinate Reference System (CRS) arguments: NA
#$`12`
#SpatialPoints:
# x y
#1 56.33333 43.66667
#Coordinate Reference System (CRS) arguments: NA
P.S。我一直认为你应该能够做到这一点我有一个SpatialCollections
的对象,但似乎你不能指定同一类型的list
个空间对象(尽管那个类的文档说的是什么)。
答案 1 :(得分:1)
如果您通过取X和Y值的平均值来计算质心,则可以使用aggregate
:
aggregate(.~Name, data=dat, mean)
# Name X Y
# 1 12 56.33333 43.66667
# 2 16 55.28571 38.57143
这似乎与gCentroid
:
library(sp)
library(rgeos)
spdf <- dat
coordinates(spdf) <- c("X", "Y")
gCentroid(spdf[spdf$Name == 12,], byid=FALSE)
# SpatialPoints:
# x y
# 1 56.33333 43.66667
# Coordinate Reference System (CRS) arguments: NA
gCentroid(spdf[spdf$Name == 16,], byid=FALSE)
# SpatialPoints:
# x y
# 1 55.28571 38.57143
# Coordinate Reference System (CRS) arguments: NA