R中lapply中的匿名函数(使用haversine计算距离)

Anonymous function in lapply (calculate distance using haversine)in R

我需要使用 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 函数来获得这个 done.I 对 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)})

我很难从函数中的列访问数据。感谢任何帮助。

如果你想用 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)
})

简单的方法:

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-05-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-05-16 创建