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”字段的文档很少。有人对我如何计算每个”名称”的质心有任何建议吗?
- 您的问题不可重现。您需要在其中添加 library(sp) ; coordinates(spdf) = c(“X”,”Y”)
- 对不起。是的,你是正确的大卫。我需要补充一点。
文档有点混乱,但是您没有指定 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` |
附言我一直认为你应该能够做到这一点,我有一个 SpatialCollections 的对象,但似乎你不能指定一个 list 相同类型的空间对象(尽管该类的文档说)。
- 我注意到的一件事是在运行 gCentroid 后没有与 SpatialPoints 关联的”名称”。有没有办法将它重新附加到输出或者我只是错过了什么?
- @user2359494 我已经稍微更新了一点,以展示您如何通过调用 setNames 来做到这一点。 HTH。
如果你通过取 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 |
- 但是,请注意,当您采用投影点的质心(即具有有效的 proj4string)时,情况可能并非如此,尤其是在较大的地理距离上…(球体上的点)
- 谢谢乔西尔伯。你是对的,这似乎也有效。我在是否使用这种方法(很干净)或上面的西蒙的方法上来回走动。我想我更喜欢使用 gCentroid 固有的功能,以防我将来使用投影。
- @SimonO\\’Hanlon 谢谢 – 这当然是真的,并且根据预测点,您的方法绝对是更好的方法!
来源:https://www.codenong.com/23351743/