R 在两个方向的罗盘上找到最近的方位;转换为现有公式

R 在两个方向的罗盘上找到最近的方位;转换为现有公式,r,bearing,R,Bearing,Mandar在这个Q/A中为我优雅地编写了这段代码 a列和b列中的值是指南针方位。目前,公式查看a列中的一个值,并将其与b列中的所有值进行比较,找到最接近的值。但我意识到我需要它做的是查看b列中的一个值,但不仅要根据绝对差找到最近的值,还要考虑到它是一个指南针方位。例如:对于a列中358.0600171的值,当前公式将返回b列中344.383796的值,该值与358.060171相差约14度;但是,b列的实际最近轴承值应为1.0294907,与358.0600171仅成3度角。我想在当前公式中加

Mandar在这个Q/A中为我优雅地编写了这段代码

a列和b列中的值是指南针方位。目前,公式查看a列中的一个值,并将其与b列中的所有值进行比较,找到最接近的值。但我意识到我需要它做的是查看b列中的一个值,但不仅要根据绝对差找到最近的值,还要考虑到它是一个指南针方位。例如:对于a列中358.0600171的值,当前公式将返回b列中344.383796的值,该值与358.060171相差约14度;但是,b列的实际最近轴承值应为1.0294907,与358.0600171仅成3度角。我想在当前公式中加入一个函数来解释这个指南针方位问题:它完成所有其他需要的计算、过滤和列创建


这里有一个类似的查询(),但我需要帮助了解该函数是否在R中工作,以及如何将其合并到现有公式中

geosphere软件包有几个函数,包含了球面点之间的距离

我不确定它是否会是您想要的-您可能必须弄清楚数据中的指南针方位如何转换为您需要的输入

我注意到你遇到的问题是,它将绝对距离视为数值差,而不是考虑到你应该在360度时重置为0的事实。您可以通过编写一个函数来说明这一点,该函数规定求和(坐标和360之间的差值)和(其他坐标)

例如: -c1是输入坐标 -c2是你比较它的坐标

如果c1-c2>180{(360-c1)+c2}


我不完全理解您的意图,因此不确定这是否正确,但希望它能有所帮助。

geosphere软件包有一些函数,包含了球面点之间的距离

我不确定它是否会是您想要的-您可能必须弄清楚数据中的指南针方位如何转换为您需要的输入

我注意到你遇到的问题是,它将绝对距离视为数值差,而不是考虑到你应该在360度时重置为0的事实。您可以通过编写一个函数来说明这一点,该函数规定求和(坐标和360之间的差值)和(其他坐标)

例如: -c1是输入坐标 -c2是你比较它的坐标

如果c1-c2>180{(360-c1)+c2}


我不完全理解您的意图,因此不确定这是否正确,但希望能有所帮助。

我们可以找到最近的指南针方位,如下所示:

nearest = function(i,df){
  diff = abs(df[i, 1] - df[, 2])
  diff = pmin(diff, 360-diff)
  which.min(diff)
}

df$nearest_b = sapply(1:NROW(df), nearest, df[1:2])
df$nearest_a = sapply(1:NROW(df), nearest, df[2:1])

#            a          b nearest_b nearest_a
# 1   12.97221 297.911727        16        17
# 2   69.64817 298.190875         6        17
# 3  318.87946 169.038635         5         5
# 4  326.17622 169.320139         5         5
# 5  137.54006 336.659531        11        15
# 6  358.06002  94.708903        16         9
# 7  258.92824  94.775309         8         9
# 8   98.57514 290.198320         7        17
# 9   98.46303 290.407898         7        17
# 10  17.22764 344.383796        16        19
# 11 316.64421 148.786547         2         5
# 12 310.73702 153.328774         2         5
# 13 237.32708 107.839712        19         8
# 14 250.65386 108.057057        19         8
# 15 337.09543 180.631177         5         5
# 16 137.03365   1.029491        11         6
# 17 301.22772 185.206285         2         5
# 18 332.93530 185.979224         5         5
# 19 340.84127 220.404385        10        13
数据

df = read.table(text =
"a   b   c   d
12.9722051  297.9117268 1   1
69.64816997 298.1908749 2   2
318.8794557 169.0386352 3   3
326.1762208 169.3201391 4   4
137.5400592 336.6595313 5   5
358.0600171 94.70890334 6   6
258.9282428 94.77530919 7   7
98.57513917 290.1983195 8   8
98.46303072 290.4078981 9   9
17.2276417  344.383796  10  10
316.6442074 148.786547  11  11
310.7370168 153.3287735 12  12
237.3270752 107.8397117 13  13
250.6538555 108.0570571 14  14
337.0954288 180.6311769 15  15
137.0336521 1.0294907   16  16
301.2277242 185.2062845 17  17
332.935301  185.9792236 18  18
340.841266  220.4043846 19  19",
header = T)[,1:2]

我们可以找到最近的罗盘方位,如下所示:

nearest = function(i,df){
  diff = abs(df[i, 1] - df[, 2])
  diff = pmin(diff, 360-diff)
  which.min(diff)
}

df$nearest_b = sapply(1:NROW(df), nearest, df[1:2])
df$nearest_a = sapply(1:NROW(df), nearest, df[2:1])

#            a          b nearest_b nearest_a
# 1   12.97221 297.911727        16        17
# 2   69.64817 298.190875         6        17
# 3  318.87946 169.038635         5         5
# 4  326.17622 169.320139         5         5
# 5  137.54006 336.659531        11        15
# 6  358.06002  94.708903        16         9
# 7  258.92824  94.775309         8         9
# 8   98.57514 290.198320         7        17
# 9   98.46303 290.407898         7        17
# 10  17.22764 344.383796        16        19
# 11 316.64421 148.786547         2         5
# 12 310.73702 153.328774         2         5
# 13 237.32708 107.839712        19         8
# 14 250.65386 108.057057        19         8
# 15 337.09543 180.631177         5         5
# 16 137.03365   1.029491        11         6
# 17 301.22772 185.206285         2         5
# 18 332.93530 185.979224         5         5
# 19 340.84127 220.404385        10        13
数据

df = read.table(text =
"a   b   c   d
12.9722051  297.9117268 1   1
69.64816997 298.1908749 2   2
318.8794557 169.0386352 3   3
326.1762208 169.3201391 4   4
137.5400592 336.6595313 5   5
358.0600171 94.70890334 6   6
258.9282428 94.77530919 7   7
98.57513917 290.1983195 8   8
98.46303072 290.4078981 9   9
17.2276417  344.383796  10  10
316.6442074 148.786547  11  11
310.7370168 153.3287735 12  12
237.3270752 107.8397117 13  13
250.6538555 108.0570571 14  14
337.0954288 180.6311769 15  15
137.0336521 1.0294907   16  16
301.2277242 185.2062845 17  17
332.935301  185.9792236 18  18
340.841266  220.4043846 19  19",
header = T)[,1:2]
检查此代码: 刚刚更改了使用ifelse定义orderx的方式 现在,如果角度之间的abs差值大于180,则使用360差值(该值较低);否则,如果差异已经检查此代码: 刚刚更改了使用ifelse定义orderx的方式
现在,如果角度之间的abs差值大于180,则使用360差值(该值较低);否则,如果差异已经存在,您可以简单地更改订单X 180、abs(df$b-valuea)、360 abs(df$b-valuea)),否则其他一切都应该是一样的,或者上面的代码中有一些小故障,这是正确的订单X 180、abs(df$b-valuea)、360 abs(df$b-valuea)))您可以简单地更改订单X 180、abs(df$b-valuea)、360 abs(df$b-valuea))否则其他的一切都应该是一样的,或者上面的代码中有一些小故障,这里是正确的一个订单X 180,abs(df$B-valueA),360 abs(df$B-valueA)))
setwd("~/Desktop/")
df <- read.table("trial.txt",header=T,sep="\t")
names(df) <- c("a","B","C","D")
df_backup <- df
df$newcol <- NA

used <- c()
for (i in seq(1,length(df$a),1)){
  print("######## Separator ########")
  print(paste("searching right match that fits criteria for ",df$a[i],"in column 'a'",sep=""))
  valueA <- df[i,1]
  # orderx <- order(abs(df$B-valueA))
  orderx <- order(ifelse(360-abs(df$B-valueA) > 180, abs(df$B-valueA) ,360-abs(df$B-valueA)))

  index=1
  while (is.na(df$newcol[i])) {
    j=orderx[index]
    if (df$B[j] %in% used){
      print(paste("passing ",df$B[j], "as it has already been used",sep=""))
      index=index+1
      next
    } else {
      indexB <- j
      valueB <- df$B[indexB]
      print(paste("trying ",valueB,sep=""))

      if (df$C[i] != df$D[indexB]) {
        df$newcol[i] <- df$B[indexB]
        print(paste("using ",valueB,sep=""))
        used <- c(used,df$B[indexB])
      } else {
        df$newcol[i] <- NA
        print(paste("cant use ",valueB,"as the column C (related to index in A) and D (related to index in B) values are matching",sep=""))
      }

      index=index+1
    }
  }
}