我正在尝试通过使用一个函数来计算动物的总行进距离,该函数使用纬度位置上的差异来输出行进的距离。嵌套循环有一些问题。
函数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)
}
}
答案 0 :(得分:0)
通常在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)
}
避免这种构造的一个原因是您正在逐步增长对象(有关更多信息,请参见here)。