【问题标题】:R Run function on all other data but the value being used in functionR对所有其他数据运行函数,但函数中使用的值
【发布时间】:2015-05-11 13:14:44
【问题描述】:

所以我有一个计算两个位置之间距离的公式,但是我想要第二个函数使用这个。 第二个函数将获取一个包含对应数字 1、2、3 等的 lat、long 值的列表。然后对于列表中的每个点,对该列中的所有其他 lat long 数据运行 GPSDist。找出距离 (d) 值最小的集合,并说出 lat long 对应的数字。

GPSDist <- function(lon1,lat1,lon2,lat2,u){
  if (u=="k"){R<-6373}
  if (u=="m"){R<-6378137}
  if (u=="M"){R<-3961}
  if (u=="k"){print("unit = kilometers")}
  if (u=="m"){print("unit = meters")}
  if (u=="M"){print("unit = miles")} 

 radians <- 0.0174532925
 lon1 <- lon1* radians
 lat1 <- lat1* radians
 lon2 <- lon2* radians
 lat2 <- lat2* radians
 dlon <- lon2-lon1
 dlat <- lat2-lat1
 a <- ((sin((dlat)/2))^2) + cos(lat1) * cos(lat2) * ((sin((dlon)/2))^2)
 c <- 2 * atan2(sqrt(a), sqrt(1-a)) 
 d = c*R

 return(d)
}

为了清楚起见,我想在每个点上使用该功能(GPSDist),假设有一个数据集 1 到 5; 使用点 1 对抗点 2、3、4、5。按其各自的编号找到最小的列表。 使用第 2 点与第 1、3、4、5 点等进行比较。

【问题讨论】:

  • 您的问题是什么?您的函数GPSDist() 似乎正在按您的计划工作。
  • 我认为 RyanMe321 想知道如何找到点之间的最小距离,前提是它们都在数据框或矩阵中。
  • 我想在每个点上使用该函数(GPSDist),假设有一个数据集 1 到 5;使用点 1 对抗点 2、3、4、5。按其各自的编号找到最小的列表。使用第 2 点与第 1、3、4、5 点等进行比较。

标签: r


【解决方案1】:

首先,定义一个示例数据集总是有帮助的。所以,这里有一个给你:

point1 <- c(1,3)
point2 <- c(4,5)
point3 <- c(7,9)
point4 <- c(11,13)
point5 <- c(89,5)

pointList <- list(point1, point2, point3, point4, point5)

接下来,这可能可以通过嵌套的for 循环来解决。

GPDistOthers <- function(inputList, u) {
  output <- list()
  for (i in 1:length(inputList)) {
    currentList <- list()
    for (j in 1:length(inputList)) {
      if (i != j) {
        currentList <- c(currentList, GPSDist(inputList[[i]][1], inputList[[i]][2], inputList[[j]][1], inputList[[j]][2], u))
      }
    }
    output[[length(output)+1]] <- currentList
  }
  return(output)
}

如果您尝试多次运行,您将通过使用lapply 实现此功能来使您的代码运行得更快,如下所述:Access lapply index names inside FUN

【讨论】:

    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多