我有以下样本:
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()
创建两个新列(longlead
和latlead
),过滤掉NA
值(因为它们是组中的最后一个条目,因此没有后续值可用于计算距离),然后使用distCosine()
执行逐行操作
我发现只使用以下命令而不使用管道更容易:
Test <- mutate(DIST = distHaversine(c(LONG_DEB, LAT_DEB), c(LONG_FIN, LAT_FIN)), rowwise(Test))