Вложено для петель, чтобы найти пройденное расстояние - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь определить общее расстояние, пройденное животным, используя функцию, которая использует различия в длинных позициях по широте для вывода пройденного расстояния. Возникли проблемы с вложенными циклами.

Функция ComputeDistance принимает аргументы Lat1, Lat2, Long1, Long 2 в указанном порядке. Столбец 5 DistTest содержит значения широты, а 6 содержит значения долготы.

Так что для объекта «output» я пытаюсь получить последовательные расстояния, проходящие через все 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)


    }
  }

1 Ответ

0 голосов
/ 05 апреля 2019

Как правило, в R лучше найти функции, которые выполняют циклы для вас, так как большинство из них настроены для этого. В этом случае вы можете попробовать использовать mutate и lead из пакета dplyr:

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

Одна из причин, по которой следует избегать этой конструкции, заключается в том, что вы постепенно увеличиваете объект (подробнее об этом см. здесь ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...