【发布时间】:2018-10-05 01:48:21
【问题描述】:
我的问题基本上是这样的:calculating distance between two row in a data.table 但我正在使用 data.table 语法而不是 for 循环来寻找答案。
我有一个这样的 data.table:
Lat Lon Time Bus
52.21808 20.96675 2018-04-20 21:27:26 3
52.25882 20.89850 2018-04-20 21:27:23 8
52.24347 21.08460 2018-04-20 21:27:27 1
52.21935 20.97186 2018-04-20 21:28:31 3
52.25808 20.89790 2018-04-20 21:28:32 8
52.24541 21.08522 2018-04-20 21:28:36 1
我想计算两个连续点之间的距离,按总线分组,使用例如geosphere 包中的 distGeo。所以像:
d[,distance:=distGeo(c(Lon, Lat), ???????),by=Bus]
编辑我得到一些有用的结果使用
d[,distance:=distGeo(cbind(Lon, Lat)),by=Bus]
但不完全正确:有一个警告,每个组的一个项目需要回收。有没有办法在每辆巴士的第一行或最后一行获得 NA?
EDIT 2 看起来我有。
d[,distance:=c(distGeo(cbind(Lon, Lat)),NA) ,by=Bus]
【问题讨论】:
-
如果每辆巴士正好有两个点,
distGeo(c(Lon[1], Lat[1]), c(Lon[2], Lat[2])),我猜。如果可能超过两点,也许看看?shift。我不熟悉 distGeo 的语法,上面的示例不容易复制粘贴到 R 中重现。 -
我相信,
distGeo确实将matrix作为参数。而不是c(Lon,Lat) maybe you should look intocbind(Lon,Lat)` 只是...在这种情况下,我认为您不需要第二个参数?? -
@Onyambu 这似乎有效!唯一的事情是我收到一个警告,因为有一行未定义答案:“提供了 34 个项目以分配给‘距离’列中大小为 35 的组 1(回收后剩下 1 个项目)。”等等
-
这似乎有效?
c?或cbind? -
d[,distance:=distGeo(cbind(Lon, Lat)),by=Bus] 有效。对于给定的行,我得到这一行和下一行之间的距离,对于最后一行,第一个距离被回收,这是误导性的,我宁愿在那里得到 NA,或者理想情况下在第一行得到 NA
标签: r data.table