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

时间:2016-05-09 09:41:00

标签: r rows distance

我有以下样本:

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))

看起来该函数不起作用,我猜循环有问题转到下一行。

可能出现什么问题?

2 个答案:

答案 0 :(得分:4)

你可以尝试:

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

这里的想法是使用longlead创建两个新列(latleadlead()),过滤掉NA值(因为它们是最后一个条目)组,因此,没有后续值来计算距离),然后使用distCosine()

执行行方式操作

答案 1 :(得分:-1)

我发现在没有管道的情况下使用以下命令更容易:

.equals