如何解决R中lapply中的匿名函数使用haversine计算距离
我需要使用 pracma 库中的haversine 函数计算起点和终点坐标之间的距离。我打算像这样使用haversine函数:
distance <- haversine(c(start_lat,start_lng),c(end_lat,end_lng),R = 6371.0)
我需要对数据框中的所有可用记录执行此操作,并将其存储为同一数据框中名为 distance 的列。下面给出了一个示例数据框:
start_lat <- c(41.9359,41.8604,41.9359,41.8969,41.8708)
start_lng <- c(-87.6784,-87.6258,-87.6784,-87.6217,-87.625)
end_lat <- c(41.9493,41.8708,41.9171,41.9080,41.8708)
end_lng <- c(-87.6463,-87.6257,-87.7102,-87.6315,-87.6257)
df <- data.frame(start_lat = start_lat,start_lng = start_lng,end_lat = end_lat,end_lng = end_lng)
我正在考虑使用 lapply 函数来完成这项工作。我对 R 很陌生,我无法完全理解我们如何实现这一点。
我是这样试的:
df$dsitance <- lapply(df,function(x){
start_coord <- x[c("start_lat","start_lng")]
end_coord <- x[c("end_lat","end_lng")]
dist <- haversine(start_coord,end_coord,R= 6371.0)
return(dist)})
我正在努力从函数内的列中访问数据。任何帮助表示赞赏。
解决方法
简单的方法:
library(spatialrisk)
library(dplyr)
start_lat <- c(41.9359,41.8604,41.9359,41.8969,41.8708)
start_lng <- c(-87.6784,-87.6258,-87.6784,-87.6217,-87.625)
end_lat <- c(41.9493,41.8708,41.9171,41.9080,41.8708)
end_lng <- c(-87.6463,-87.6257,-87.7102,-87.6315,-87.6257)
df <- data.frame(start_lat = start_lat,start_lng = start_lng,end_lat = end_lat,end_lng = end_lng)
df %>%
mutate(dist = spatialrisk::haversine(start_lat,start_lng,end_lat,end_lng))
#> start_lat start_lng end_lat end_lng dist
#> 1 41.9359 -87.6784 41.9493 -87.6463 3047.88841
#> 2 41.8604 -87.6258 41.8708 -87.6257 1157.75239
#> 3 41.9359 -87.6784 41.9171 -87.7102 3363.98884
#> 4 41.8969 -87.6217 41.9080 -87.6315 1478.54766
#> 5 41.8708 -87.6250 41.8708 -87.6257 58.02598
由 reprex package (v2.0.0) 于 2021 年 5 月 16 日创建
或者不使用dplyr::mutate()
:
df$dist <- spatialrisk::haversine(df$start_lat,df$start_lng,df$end_lat,df$end_lng)
由 reprex package (v2.0.0) 于 2021 年 5 月 16 日创建
,如果你想用 lapply
为每一行应用函数,你可以这样做:
df$distance <- lapply(seq(nrow(df)),function(x){
start <- unlist(df[x,c("start_lat","start_lng")])
end <- unlist(df[x,c("end_lat","end_lng")])
haversine(start,end,R= 6371.0)
})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。