繁体   English   中英

在 R 中计算净距离(欧几里得距离)

[英]Computing net distance (Euclidean distance) in R

我之前询问过并获得了在 R 中计算欧几里得距离的巨大帮助。 现在,我需要计算从第一个点到轨道数据中所有其他点的欧几里得距离。 这是我的数据的样子:

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")

SimonO101 非常棒地给了我一个代码,可以计算每个轨道从起始位置到最终位置的欧几里德距离:

## 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 )
} )

如何编辑代码,使其不仅具有从开始到结束的欧几里得距离,而且还具有每个 X、Y 位置的欧几里得距离? 再次感谢!

编辑:还有:如何将结果可视化为矩阵。 谢谢

一个可能的解决方案:

f <- function(x) {
j <- nrow(x)
end <- as.numeric(x[j,c("X","Y")])
x <- x[-j,c("X", "Y")]
dist <- colSums((t(x)-end)^2)
dist
}
lapply(dfs, f)

我会使用stats包中的dist函数。 您可以轻松地将其应用于您的数据:

lapply( dfs , function(x) dist( x[,c("X","Y")] , diag = TRUE )[1:nrow(x)] )

这个想法是我们对每个数据帧进行操作,将dist函数应用于每个数据帧的"X""Y"列。 最后的子集 ( [1:nrow(x)] ) 用于仅返回第一个点和所有其他点之间的距离。 如果您想要每个轨道的全距离矩阵,请删除此子集。

是否可以直接在函数中计算欧几里得距离?

例如,使用此函数我试图计算观测值之间的距离高达 8 m,但我想添加一个条件,即仅计算来自同一组的观测值之间的距离? 我的观察结果是具有来自不同地块(11 个地块,2000 棵树)的 x,y 位置坐标的树。

`search_dfixed <- function(id, x, y, dist) {
.class <- if (class(id) == "factor") {
"character"
 } else {
 class(id)
 }

 m <- as.matrix (dist(data.frame(x, y)))

 rownames(m) <- id; colnames(m) <- id

 z <- as.data.frame(m) %>%
 tibble::as_tibble() %>%
 dplyr::mutate(id = id) %>%
 tidyr::gather(competitor, .dist, -id) %>%
 dplyr::filter(
  .dist != 0,
  .dist <= dist
  ) %>%
  dplyr::arrange(id, .dist) %>%
  dplyr::mutate(
  id = 'class<-'(id, .class),
  competitor = 'class<-'(competitor, .class)
  )

  return(z)
  }`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM