关于 R:R – 寻找不同 id 值的质心


R - Finding centroids of different id values

我正在尝试找到我创建的 SpatialPointsDataFrame 的质心。以下是名为"spdf"的数据框片段。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    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

我正在使用"rgeos"包中的"gCentroid"函数来识别质心。我可以使用 gCentroid(spdf, byid = FALSE) 计算整个数据帧的质心,但是当我尝试使用 gCentroid(spdf, byid = TRUE, id ="Name") 根据"名称"字段计算质心时出现错误。换句话说,根据上面的数据,我想得到名称"12"和"16"的两个质心。 gCentroid 上关于"id"字段的文档很少。有人对我如何计算每个"名称"的质心有任何建议吗?


文档有点混乱,但是您没有指定 ID 输入,而是指定了输出。您的示例中的每个点都有自己的 ID(数据框的行名,根据定义必须是唯一的)。但是,您可以通过 df$Name 中的唯一值对数据框进行子集化并以这种方式计算质心,从而轻松获得所需的输出...

1
2
3
4
5
6
7
8
9
10
11
12
13
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

附言我一直认为你应该能够做到这一点,我有一个 SpatialCollections 的对象,但似乎你不能指定一个 list 相同类型的空间对象(尽管该类的文档说)。


如果你通过取 X 和 Y 值的平均值来计算质心,你可以使用 aggregate:

1
2
3
4
aggregate(.~Name, data=dat, mean)
#   Name        X        Y
# 1   12 56.33333 43.66667
# 2   16 55.28571 38.57143

这似乎与 gCentroid:

的结果相匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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