计算净平方位移,并在达到目标时重复0

时间:2014-11-13 01:02:38

标签: r

如果发布了类似的查询,则道歉 - 无法找到它。

我有多个人的GPS位置(UTM)。

       X       Y AnimalID      DATE
1 550466 4789843       10 1/25/2008
2 550820 4790544       10 1/26/2008
3 551071 4791230       10 1/26/2008
4 550462 4789292       10 1/26/2008
5 550390 4789934       10 1/27/2008
6 550543 4790085       10 1/27/2008

我正在尝试计算净平方位移,一旦NSD达到至少800米,我想在下一行重复从0开始的公式。

所需的输出是:

     XLOC    YLOC ANIMALID        DATETIME Xdist Ydist  NSD GROUP
1  550466 4789843       10 1/25/2008 17:00   354   701  785     1
2  550820 4790544       10  1/26/2008 1:00   605  1387 1513     1
3  551071 4791230       10  1/26/2008 9:00   609  1938 2031     2
4  550462 4789292       10 1/26/2008 17:00    72   642  646     3
5  550390 4789934       10  1/27/2008 1:00    81   793  797     3
6  550543 4790085       10  1/27/2008 9:00    82   149  170     3
7  550380 4789441       10 1/27/2008 17:00   178   192  262     3
8  550284 4789484       10  1/28/2008 1:00   559   426  703     3
9  549903 4789718       10  1/28/2008 9:00     0    35   35     3
10 550462 4789327       10 1/28/2008 17:00   574   275  636     3
11 549888 4789567       10  1/29/2008 1:00   532   263  593     3
12 549930 4789555       10  1/29/2008 9:00    65     4   65     3
13 550397 4789288       10 1/29/2008 17:00   124   140  187     3
14 550338 4789432       10  1/30/2008 1:00   554   339  649     3
15 549908 4789631       10  1/30/2008 9:00    84    75  113     3
16 550378 4789367       10 1/30/2008 17:00   657  1876 1988     3
17 550414 4789354       10  1/31/2008 1:00   531    91  539     4
18 549883 4789445       10  1/31/2008 9:00   188   136  232     4
19 550226 4789490       10 1/31/2008 17:00   126   141  189     4
20 550288 4789495       10   2/1/2008 1:00   176   187  257     4

我添加了'群组'列表示何时达到800 NSD。

我真的很难为这种特殊方法编写代码,主要是因为第一个UTM必须相同才能达到800米。

换句话说,我不能这样做:

xdist<-abs(diff(X)
ydist<-abs(diff(Y)
nsd<-sqrt(xdist^2+ydist^2)

我需要这样做,直到达到目标800米为止:

xdist <- abs(X in row 2 - 550446)
ydist <- abs(Y in row 2 - 4789843)

然后,独特的UTM需要来自第3,4,1行等等。

我希望这是有道理的,我会感激任何帮助!

1 个答案:

答案 0 :(得分:0)

我认为这就是你要找的东西:

data$GROUP[1] <- 1
data$Xdist[1] <- data$XLOC[2] - data$XLOC[1]
data$Ydist[1] <- data$YLOC[2] - data$YLOC[1]
data$NSD[1]   <- as.integer(sqrt(data$Xdist[1]^2+data$Ydist[1]^2))
for ( i in 2:(nrow(data)-1)) {
  if ( data$NSD[i-1] > 800) {
    data$Xdist[i] <- data$XLOC[i+1] - data$XLOC[i]
    data$Ydist[i] <- data$YLOC[i+1] - data$YLOC[i]
    data$NSD[i]   <- as.integer(sqrt(data$Xdist[i]^2+data$Ydist[i]^2))
    data$GROUP[i] <- (data$GROUP[i-1] + 1)
  } else {
    data$Xdist[i] <- data$XLOC[i+1] - data$XLOC[i] + data$Xdist[i-1]
    data$Ydist[i] <- data$YLOC[i+1] - data$YLOC[i] + data$Ydist[i-1]
    data$NSD[i]   <- as.integer(sqrt(data$Xdist[i]^2+data$Ydist[i]^2))
    data$GROUP[i] <- (data$GROUP[i-1])    
  }
}

输出:

> data
     XLOC    YLOC ANIMALID       DATE  TIME Xdist Ydist  NSD GROUP
1  550466 4789843       10 1/25/20081  7:00   354   701  785     1
2  550820 4790544       10  1/26/2008  1:00   605  1387 1513     1
3  551071 4791230       10  1/26/2008  9:00  -609 -1938 2031     2
4  550462 4789292       10  1/26/2008 17:00   -72   642  646     3
5  550390 4789934       10  1/27/2008  1:00    81   793  797     3
6  550543 4790085       10  1/27/2008  9:00   -82   149  170     3
7  550380 4789441       10  1/27/2008 17:00  -178   192  261     3
8  550284 4789484       10  1/28/2008  1:00  -559   426  702     3
9  549903 4789718       10  1/28/2008  9:00     0    35   35     3
10 550462 4789327       10  1/28/2008 17:00  -574   275  636     3
11 549888 4789567       10  1/29/2008  1:00  -532   263  593     3
12 549930 4789555       10  1/29/2008  9:00   -65    -4   65     3
13 550397 4789288       10  1/29/2008 17:00  -124   140  187     3
14 550338 4789432       10  1/30/2008  1:00  -554   339  649     3
15 549908 4789631       10  1/30/2008  9:00   -84    75  112     3
16 550378 4789367       10  1/30/2008 17:00   -48    62   78     3
17 550414 4789354       10  1/31/2008  1:00  -579   153  598     3
18 549883 4789445       10  1/31/2008  9:00  -236   198  308     3
19 550226 4789490       10  1/31/2008 17:00  -174   203  267     3
20 550288 4789495       10   2/1/2008  1:00    NA    NA   NA    NA

另外我认为你在xdist16上面犯了一个错误,因为对于xlocline17 - xlocline16 + xdistline15 = 550414 - 550378 +( - 84)= -48而不是你指定的657。除非我错过了你的公式。

希望这有帮助!