【问题标题】:Distance between signals / rows for each levels in RR中每个级别的信号/行之间的距离
【发布时间】:2018-04-11 04:53:04
【问题描述】:

我有以下示例:

Id = c(1, 1,3,3,3)
long =  c("60.466681", "60.664116", "60.766690", "60.86879", "60.986569" )
lat = c("24.158253", "24.266036", "24.368283", "24.479058", "24.5599858")
data = data.frame(Id, long, lat)  
data$long <- as.numeric(as.character(data$long))
data$lat <- as.numeric(as.character(data$lat))
data$Id <- as.factor(data$Id)

我想创建一个名为distance 的新列,它是因子Id 的每个级别的每个纬度/经度点之间的距离的累积总和

我尝试使用在 Internet 上找到的内容并使用包 geosphere 中的 distCosine() 创建自己的函数。我终于明白了:

创建函数

 distance <- Vectorize(function(i, j) distCosine(data[i,], data[j,]))

运行函数

  library(dplyr)
Dist <- data %>%
  filter(Id != 0) %>%  #I keep this because in my final data I can have Id==0
  group_by(Id) %>%
  do(distance(.$lat, .$long))

看来函数不工作了,估计是循环到下一行有问题。

可能出了什么问题?

【问题讨论】:

  • 在函数 distCosine 的 documentation 中,它说 p1 和 p2 “可以是两个数字的向量、2 列的矩阵(第一列是经度,第二列是纬度)或 SpatialPoints * 目的”。您改为提供两个坐标向量。此外,使用 dplyr,您可以在修复函数后执行:Dist &lt;- data %&gt;% filter(Id != 0) %&gt;% group_by(Id) %&gt;% summarize(dist = distance(lat,long))
  • 谢谢@shreyasgm。这是我所做的:函数现在是distance &lt;- Vectorize(function(i, j) distCosine(data[i,c("lat", "long")], data[j,c("lat", "long")])),最后一行plyr Dist &lt;- data %&gt;% filter(Id != 0) %&gt;% group_by(Id) %&gt;% summarize(dist = distance(lat,long))。 ` 位我有错误Error: expecting a single value Error during wrapup: cannot open the connection

标签: r rows distance


【解决方案1】:

你可以试试:

data %>%
  group_by(Id) %>%
  mutate(longlead = lead(long), latlead = lead(lat)) %>%
  na.omit() %>%
  rowwise() %>%
  mutate(dist = distCosine(c(long,lat), c(longlead, latlead)))

这给出了:

#Source: local data frame [3 x 6]
#Groups: <by row>
#
#      Id     long      lat longlead  latlead     dist
#  (fctr)    (dbl)    (dbl)    (dbl)    (dbl)    (dbl)
#1      1 60.46668 24.15825 60.66412 24.26604 23361.55
#2      3 60.76669 24.36828 60.86879 24.47906 16098.39
#3      3 60.86879 24.47906 60.98657 24.55999 14948.38

这里的想法是使用lead() 创建两个新列(longleadlatlead),过滤掉NA 值(因为它们是组中的最后一个条目,因此没有后续值计算距离),然后使用distCosine() 执行逐行操作

【讨论】:

  • 我认为您可以使用distCosine(cbind(long,lat),cbind(longlead,latlead)),而不是使用rowwise。另外,我可能有这个错误,但是有 3 个点的 Id = 3。这意味着应该有 3 个点的组合来计算 Id 3 的距离,对吧?
  • @shreyasgm 我理解这个问题的方式是,如果有 3 个点,OP 希望知道组中的一个点与下一个点(下一行)之间的距离在Id 3 中,你有: (point1, point2), (point2, point3), (point3, NA) (没有要计算的“点 4”)。因此,3 分只有 2 个结果。按照我的理解,你总是有 n-1 个结果(n 是组大小)。
  • 谢谢@Steven。我认为会有一个额外的 (point3,point1),但我认为你的解释也可能是有效的。
【解决方案2】:

我发现只使用以下不带管道的命令会更容易:

Test <- mutate(DIST = distHaversine(c(LONG_DEB, LAT_DEB), c(LONG_FIN, LAT_FIN)), rowwise(Test))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 2015-05-06
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多