我之前已经询问并获得了很大的帮助来计算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位置开始? 再次感谢!
编辑: 还有:如何将结果可视化为矩阵。谢谢
答案 0 :(得分:1)
可能的解决方案:
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)
答案 1 :(得分:1)
我会使用dist
包中的stats
函数。您可以轻松地将其应用于您的数据:
lapply( dfs , function(x) dist( x[,c("X","Y")] , diag = TRUE )[1:nrow(x)] )
我们的想法是,我们对每个数据帧进行操作,将dist
函数应用于每个数据框的"X"
和"Y"
列。最后的子集([1:nrow(x)]
)用于仅返回第一个点和所有其他点之间的距离。如果您想要每个轨道的完整距离矩阵,请删除此子集。
答案 2 :(得分:0)
是否可以直接在函数中计算欧几里得距离?
例如使用此功能,我试图计算观察值之间的最大距离为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)
}`