我有以下样本:
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))
看起来该函数不起作用,我猜循环有问题转到下一行。
可能出现什么问题?
答案 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
创建两个新列(latlead
和lead()
),过滤掉NA
值(因为它们是最后一个条目)组,因此,没有后续值来计算距离),然后使用distCosine()
答案 1 :(得分:-1)
我发现在没有管道的情况下使用以下命令更容易:
.equals