【问题标题】:Nested for loops to find distance traveled嵌套 for 循环以查找行进距离
【发布时间】:2019-04-05 17:34:30
【问题描述】:

我试图通过使用一个函数来获取动物行进的总距离,该函数使用经纬度位置的差异来输出行进的距离。嵌套循环有一些问题。

函数 ComputeDistance 以 Lat1、Lat2、Long1、Long 2 的顺序获取参数。 DistTest 的第 5 列包含纬度值,第 6 列包含经度值。

因此,对于“输出”对象,我试图获得通过所有 38 行的连续距离。

例如 ComputeDistance(DistTest[1,5],DistTest[2,5],DistTest[1,6],DistTest[2,6] 其次是: ComputeDistance(DistTest[2,5],DistTest[3,5],DistTest[2,6],DistTest[3,6] 其次是: ComputeDistance(DistTest[3,5],DistTest[4,5],DistTest[3,6],DistTest[4,6] …… ComputeDistance(DistTest[37,5],DistTest[38,5],DistTest[37,6],DistTest[38,6]

我认为问题在于循环正在遍历 DL 和 EL 的所有可能组合,而不仅仅是按顺序进行。

下面是我目前正在使用的代码。

## rows 1-37 and rows 2-38
DL <- 1:37
EL <- 2:38




## subsetting for one tagged animal
DistTest <- subset(Dispsum, Tag.ID == 1658)

## creating blank objects to save output in
testid <- c()
testdistance <- c()

for( j in DL){
  for( k in EL){

    output <- (ComputeDistance(DistTest[j,5], DistTest[k,5],DistTest[j,6], DistTest[k,6]))
    Name <- 1658
    testid <- rbind(testid, Name)
    testdistance <- rbind(testdistance,output)


    }
  }

【问题讨论】:

标签: r for-loop


【解决方案1】:

通常在 R 中,最好找到为您执行循环的函数,因为它们中的大多数都是为此而设置的。在这种情况下,您可以尝试使用 dplyr 包中的 mutatelead

library(dplyr)

df <- dplyr::tibble(lat = 1:5, lon = 5:1)
df
# A tibble: 5 x 3
#     lat   lon distance
#   <int> <int>    <dbl>
# 1     1     5     1.41
# 2     2     4     1.41
# 3     3     3     1.41
# 4     4     2     1.41
# 5     5     1    NA   

df %>% mutate(distance = ComputeDistance(lat, lead(lat), lon, lead(lon)))
# A tibble: 5 x 3
#      lat   lon distance
#    <int> <int>    <dbl>
#  1     1    10     1.41
#  2     2     9     1.41
#  3     3     8     1.41
#  4     4     7     NA

如果你真的想坚持使用for 循环,你只需要一个来解决这个问题。你说得对,你正在经历每一种组合。一种选择是:

for (i in 1:37) {
    output <- ComputeDistance(DistTest[i, 5], DistTest[i + 1, 5],
                              DistTest[i, 6], DistTest[i + 1, 6])
    Name <- 1658
    testid <- rbind(testid, Name)
    testdistance <- rbind(testdistance, output)
}

避免这种结构的一个原因是您正在逐步增长一个对象(有关详细信息,请参阅here)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-27
    • 2018-02-08
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    相关资源
    最近更新 更多