【问题标题】:Euclidean distance in R using two variables in a matrixR中的欧几里得距离使用矩阵中的两个变量
【发布时间】:2013-04-22 12:58:45
【问题描述】:

我对 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 作为轨道的标识符,因为总距离也可以计算为: distance=velocity (t1-t0),我只是将所有速度乘以我的时间间隔的总和(因为它始终是 1/25 秒。

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

【问题讨论】:

  • 谢谢!但他仅从一名车手(赛道)进行计算。如果在一个矩阵中计算多个轨道(在他的情况下,是多个驱动程序)怎么办?谢谢
  • 当您说没有工作时,您收到了哪些错误消息?我假设至少 argument "x" 丢失,没有默认值 ?您有一个数据框 (trackdata) 并尝试使用例如引用列(,1)。您需要使用 [ 这是子集功能 - 即 trackdata[,1] 将为您提供第一列。 HTH!
  • 如果您将dput(head(trackdata)) 的输出作为代码块发布到您的问题中,这将很有帮助,然后我们可以在我们的计算机上重新创建您的数据的小样本。
  • @SimonO101 当我在控制台上运行它时,它有点等待另一个命令,因为箭头没有出现。所以我不知道它是否真的不起作用,或者我是否以错误的方式结束它。

标签: r euclidean-distance


【解决方案1】:

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

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

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

按轨迹计算'as the crow flies'的第一个位置和最后一个位置之间的距离:

为此,我们可以通过轨道标识符A 将数据帧split 转换为子数据帧,然后对数据的每个子集进行操作,使用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 )
} )

【讨论】:

  • 有效!谢谢,成功了!但我还需要净距离(从最后一点到第一点的距离),这就是为什么我还询问了 dist() 函数。你也可以帮忙吗?谢谢。
  • @KarenGraceBondoc 在轨道的第一个点和最后一个点之间的直线距离?
  • @KarenGraceBondoc 您可能应该将其作为另一个问题提出,但我会将解决方案粘贴到该问题中。此外,由于您是新来的,您可能会发现阅读 aboutFAQ 有助于您充分利用该网站!
  • 非常感谢(不仅是为了回答,也是为了欢迎我加入这个社区!)
猜你喜欢
  • 2014-11-18
  • 2014-06-08
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
相关资源
最近更新 更多