在R中使用矩阵中的两个变量计算欧几里得距离

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

我应该如何使用dist()函数来识别我的A?我需要这样做,因为每个轨迹的计算都应该是独立的。谢谢!


1
当你说“没有起作用”时,你收到了什么错误信息?我假设至少是“缺少参数“x”,没有默认值”?你有一个数据框(trackdata),并尝试使用例如(,1)来引用列。你需要使用[这个子集函数——即trackdata[,1]将为您获取第一列。希望对你有所帮助! - Simon O'Hanlon
Karen,就像SimonO101指出的那样,你需要学习R语言的语法。现在我们甚至无法确定trackdata是否被正确组装。 - Carl Witthoft
@SimonO101,我做的对吗(请看编辑后的帖子)?谢谢你的帮助。我在创建函数方面真的很新。 - Kaye11
@KarenGraceBondoc 是的,现在稍等一会儿,肯定会有人能够帮助你! :-) - Simon O'Hanlon
显示剩余6条评论
1个回答

1

由于您在固定时间间隔内测量了速度,因此可以将其相加以获得移动的总欧几里德距离,实际上您只需使用base R函数aggregate按每个轨迹标识符AV数据进行求和,这就是下面的命令所做的:

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

基本上,这个代码会为A的每个值聚合V。聚合函数是sum(你可以想象使用mean代替sum来计算每条轨迹的平均速度)。我们向sum传递一个额外的参数na.rm,告诉它忽略数据中的NA(我假设这些NA在每个轨迹的t = 0处)。
通过轨迹计算首尾位置之间的“直线距离”: 为此,我们可以按照轨迹标识符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 )
} )

可以了!谢谢,它起作用了!但我还需要净距离(从最后一个点到第一个点的距离),这就是为什么我也问了dist()函数的原因。你能帮忙吗?谢谢。 - Kaye11
@KarenGraceBondoc 指的是轨迹的起点和终点之间的直线距离吗? - Simon O'Hanlon
@KarenGraceBondoc 你可能应该提出另一个问题,但我会将解决方案粘贴到这个问题中。此外,由于你是新来的,阅读有关 关于我们常见问题解答 可能会对你有所帮助,以便让你更好地利用该网站! - Simon O'Hanlon
非常感谢(不仅仅是因为你的回答,还有欢迎我加入这个社区!) - Kaye11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接