用矩阵中的两个变量表示R中的欧氏距离

用矩阵中的两个变量表示R中的欧氏距离,r,euclidean-distance,R,Euclidean Distance,我对R很陌生,我试图计算矩阵中两个变量的总距离(或所有数据点上的欧几里德距离之和)和净距离(数据第一点和最后一点之间的欧几里德距离)。 我的数据通常是一个csv文件,由5个变量组成:单元格的轨迹(称为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,

我对R很陌生,我试图计算矩阵中两个变量的总距离(或所有数据点上的欧几里德距离之和)和净距离(数据第一点和最后一点之间的欧几里德距离)。 我的数据通常是一个csv文件,由5个变量组成:单元格的轨迹(称为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))} 

GD.data由于您以恒定的时间间隔测量速度,可以求和以获得移动的总欧氏距离,因此您实际上可以使用
base
R函数
aggregate
按每个轨迹标识符
A
V
数据求和,这就是下面的命令所做的:

aggregate( V ~ A , data = t1 , sum , na.rm = TRUE )
基本上,这表示,
A的每个值聚合
V。聚合函数是
sum
(您可以想象,如果使用
mean
而不是sum,这很容易成为每个轨迹的
平均
速度)。我们将另一个参数传递给
sum
,它是
na.rm
,告诉它忽略数据中的NAs(我假设每个音轨的NAs值为
t=0

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

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

## 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 )
} )
##分割数据

dfs谢谢!但他只从一个驱动程序(轨道)计算。如果在一个矩阵中使用多个轨道(在他的情况下,多个驱动程序)计算会怎么样?谢谢当你说不起作用时,你收到了什么错误消息?我假设至少缺少参数“x”,没有默认值?你有一个数据帧(
trackdata
)您需要使用
[
这是一个子集功能,即
trackdata[,1]
将为您提供第一列。HTH!如果您将
dput(head(trackdata))的输出发布出来,将会非常有帮助
将您的问题作为一个代码块,然后我们可以在我们的计算机上重新创建您的一小部分数据。@SimonO101当我在控制台上运行它时,它会等待另一个命令,因为箭头没有出现。所以我不知道它是否真的不起作用,或者我是否以错误的方式结束它。它起作用了!谢谢,它起作用了!但我还需要net距离(从最后一个点到第一个点的距离),这就是为什么我还要问dist()函数。你能在这方面提供帮助吗?谢谢。@KarenGraceBondoc是指跑道第一点和最后一点之间的直线距离吗?@KarenGraceBondoc你可能应该问这个问题,但我会在这个问题中粘贴一个解决方案。另外,由于你是新来的,你可能会发现阅读和帮助你获得答案很有帮助非常感谢你的回答,也感谢你欢迎我加入这个社区