草庐IT

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

codeneng 2023-03-28 原文

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`
#SpatialPoints:
#         x        y
#1 56.33333 43.66667
#Coordinate Reference System (CRS) arguments: NA

附言我一直认为你应该能够做到这一点,我有一个 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 谢谢 - 这当然是真的,并且根据预测点,您的方法绝对是更好的方法!

有关关于 R:R – 寻找不同 id 值的质心的更多相关文章

  1. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  2. java - 为什么 ruby​​ modulo 与 java/other lang 不同? - 2

    我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.

  3. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  4. ruby - Rails -- :id attribute? 所需的数据库索引 - 2

    因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration

  5. ruby-on-rails - 如何用不同的用户运行nginx主进程 - 2

    A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(

  6. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

  7. ruby - 从 sinatra 中的 before do block 返回不同的值 - 2

    有没有办法在sinatra的beforedoblock中停止执行并返回不同的值?beforedo#codeishere#Iwouldliketo'return"Message"'#Iwouldlike"/home"tonotgetcalled.end//restofthecodeget'/home'doend 最佳答案 beforedohalt401,{'Content-Type'=>'text/plain'},'Message!'end如果你愿意,你可以只指定状态,这里有状态、标题和正文的例子

  8. ruby-on-rails - Sunspot:如何对具有不同值的多个字段进行全文查询? - 2

    我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使

  9. ruby - 拆分字符串并分配给不同的变量 - 2

    我从ui中得到日期范围为-approved_between"=>"2013-03-17-2013-03-18"我需要拆分此approved_start_date="2013-03-17"和approved_end_date="2013-03-18"...我希望使用它在mysql中查询,因为mysql中的日期格式是created_at:2012-07-2810:35:01.我正在做的是:approved=approved_between.split("")approved_start_date=approved[0]approved_end_date=approved[2]很确定这不是处

  10. ruby - 如果散列有 key ,则使用它。否则,使用不同的 key - 2

    response是一个散列,可能看起来像以下两种情况之一:response={'demo'=>'nil','test_01'=>'DemoData'}或response={'test'=>'DemoData','demo'=>'nil'}我想做这样的事情:ifresponse.has_key?'test_01'new_response.update(:nps_score=>response['test_01']elsenew_response.update(:nps_score=>response['test']end是否有更“Ruby”的方法来解决这个问题?也许使用||的东西运算符(

随机推荐