【问题标题】:Anonymous function in lapply (calculate distance using haversine)in RR中的lapply中的匿名函数(使用haversine计算距离)
【发布时间】:2021-08-05 22:35:30
【问题描述】:

我需要使用 pracma 库中的 hasrsine 函数计算起点和终点坐标之间的距离。我打算像这样使用haversine函数:

distance <- haversine(c(start_lat,start_lng),c(end_lat,end_lng),R = 6371.0)

我需要对数据框中的所有可用记录执行此操作,并将其存储为同一数据框中称为距离的列。下面给出了一个示例数据框:

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

我正在努力从函数内的列中访问数据。任何帮助表示赞赏。

【问题讨论】:

    标签: r dataframe coordinates lapply haversine


    【解决方案1】:

    简单的方法:

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

    【讨论】:

    • 我收到以下错误错误:mutate() 输入问题dist。 x 未使用的参数(end_lng) i 输入disthaversine(start_lat, start_lng, end_lat, end_lng).,haversine 是否直接接受参数,如 start_lat、start_lng、end_lat、end_lng?我之前没用过
    • 我更新了我的答案。这能解决错误吗?
    • 错误:mutate() 输入 dist 有问题。 x 没有名为“spatialrisk”的包 i 输入 distspatialrisk::haversine(start_lat, start_lng, end_lat, end_lng)。我试过 require("spatialrisk") 也得到了以下消息,正在加载所需的包:spatialrisk 警告消息:在库中(包,lib.loc = lib.loc,character.only = TRUE,logical.return = TRUE,:那里没有名为“spatialrisk”的包
    • 你应该先安装包:install.packages("spatialrisk")
    • 感谢这项工作!输出是公里还是英里?
    【解决方案2】:

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

    【讨论】:

    • 我认为您的代码和数据中的列名不正确。检查更新的答案。
    • 谢谢!!这看起来不错,但我收到以下错误,haversine 中的错误(开始,结束,R = 6371):坐标输入格式不正确。我认为这是因为需要参数类型 hasrsine 公式,请查看以下给出的链接
    • @RajMohan 这个答案适用于我的数据df &lt;- structure(list(start_lat = 50.0333333333333, start_lng = 8.57055555555556, end_lat = 41.9786111111111, end_lng = -87.9047222222222), class = "data.frame", row.names = c(NA, -1L)),它的格式相同。
    猜你喜欢
    • 2016-04-03
    • 2016-04-06
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 2016-10-18
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多