3

我对 R 很陌生,我正在尝试从我的矩阵中的两个变量和净距离(我的数据的第一个点和最后一个点之间的欧几里得距离)计算总距离(或所有数据点上的欧几里得距离的总和)。所以只是我数据的背景。我的数据通常是一个包含 5 个变量的 csv 文件:单元格轨迹(称为 A)、时间间隔、每个单元格的 X 和 Y 位置、V = 速度。每个数据大约有 90 个轨迹并且每个轨道都应该相互独立地对待。

dput(head(t1))
structure(list(A = c(0L, 0L, 0L, 0L, 0L, 0L), T = 0:5, X = c(668L, 
668L, 668L, 668L, 668L, 668L), Y = c(259L, 259L, 259L, 259L, 
259L, 259L), V = c(NA, 0, 0, 0, 0, 0)), .Names = c("A", "T", 
"X", "Y", "V"), row.names = c(NA, 6L), class = "data.frame")

我之前不知道 dist() 函数,所以我做了自己的函数:

GD.data <- function (trackdata)
{A= trackdata(, 1); V=trackdata(, 5);
 for (i in min(A):max(A))
   while (A<=i) {GD(i) = (sum (V)*(1/25))
                 return (GD(i))} 

这没有用。我使用 A 作为轨道的标识符,并且由于总距离也可以计算为:距离 = 速度(t1-t0),我只是将所有速度乘以我的时间间隔(因为它始终是 1/25 秒。

如何以我的 A 作为标识符使用 dist() 函数?我需要这个,因为每个轨道的计算应该是分开的。谢谢!

4

1 回答 1

1

由于您以恒定的时间间隔测量速度,您可以将其相加以获得移动的总欧几里德距离,您实际上可以使用baseR 函数按每个轨道标识符aggregate对数据求和,这就是以下命令的作用:VA

aggregate( V ~ A , data = t1 , sum , na.rm = TRUE )

基本上这就是说,aggregateV 代表 A 的每个值。聚合函数是sum(您可以想象,通过使用而不是 sum ,这很容易成为mean每个轨道的速度)。mean我们向它传递了一个额外的参数sumis na.rm,告诉它忽略数据中的 NA(我假设t = 0每个轨道都在)。

按轨道计算第一个位置和最后一个位置之间的“乌鸦飞”的距离:

为此,我们可以split通过轨道标识符将数据帧转换为子数据帧A,然后对数据的每个子集进行操作,使用lapply对每个子数据帧的第一行和最后一行应用简单的斜边计算。

## Split the data
dfs <- split(t1,t1$A)

## Find hypotenuse between first and last rows for each A
lapply( dfs , function(x){
  j <- nrow(x)
  str <- x[1,c("X","Y")]
  end <- x[j,c("X","Y")]
  dist <- sqrt( sum( (end - str)^2 ) )
  return( dist )
} )
于 2013-04-22T13:43:31.817 回答