R中每个级别的信号/行之间的距离



我有以下样本:

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 的每个级别的每个纬度/经度点之间的距离的累积总和

我试着用我在互联网上找到的东西创建自己的函数,并使用包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))

看起来这个函数不起作用,我想循环到下一行有问题。

可能出了什么问题?

您可以尝试:

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() 执行逐行操作

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

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

最新更新