用R计算欧式距离
Calculate euclidean distance with R
我有数据,其中行是点,列是坐标 x、y、z。
我想计算一对点之间的欧氏距离,如 3-4、11-12、18-19 等等...例如,我不需要 3 和 11、12 之间的距离, 18
问题是我必须对 1000 行或更多行的 1074 个表进行分析,所以我正在寻找一种自动执行此操作的方法,也许是考虑到我想计算奇数和后面的偶数之间的距离这一事实。我不太关心输出格式,但请考虑在我必须 select 之后只有距离 <3.2,所以数据帧格式会很棒。
谢谢! :*
这样的事情怎么样:
首先,我会做一些假数据
set.seed(4304)
df <- data.frame(
x = runif(1000, -1, 1),
y = runif(1000, -1, 1),
z = runif(1000, -1,1)
)
以 2 秒为单位从 1 到数据集的行数创建一个值序列。
s <- seq(1, nrow(df), by=2)
使用sapply()
计算每对点之间的距离。
out <- sapply(s, function(i){
sqrt(sum((df[i,] - df[(i+1), ])^2))
})
将距离组织成数据框
res <- data.frame(
pair = paste(rownames(df)[s], rownames(df)[(s+1)], sep="-"),
dist=out)
head(res)
# pair dist
# 1 1-2 1.379992
# 2 3-4 1.303511
# 3 5-6 1.242302
# 4 7-8 1.257228
# 5 9-10 1.107484
# 6 11-12 1.392247
这是一个可以应用于 data.frame 或保存数据的矩阵的函数。
DistEucl <- function(X){
i <- cumsum(seq_len(nrow(X)) %% 2 == 1)
sapply(split(X, i), function(Y){
sqrt(sum((Y[1, ] - Y[2, ])^2))
})
}
DistEucl(df1)
# 1 2 3 4
#1.229293 1.234273 1.245567 1.195319
使用 中的数据,除了上述函数的 return 值中的名称属性外,结果相同。
out2 <- DistEucl(df)
all.equal(out, out2)
#[1] "names for current but not for target"
identical(out, unname(out2))
#[1] TRUE
题中数据
x <- c(13.457, 13.723, 15.319, 15.713, 18.446, 19.488, 19.762, 19.743)
y <- c(28.513, 29.656, 28.510, 27.342, 28.827, 28.24, 29.841, 30.942)
z <- c(40.513, 40.147, 43.281, 43.218, 43.095, 43.443, 40.094, 40.559)
df1 <- data.frame(x, y, z)
我有数据,其中行是点,列是坐标 x、y、z。
我想计算一对点之间的欧氏距离,如 3-4、11-12、18-19 等等...例如,我不需要 3 和 11、12 之间的距离, 18 问题是我必须对 1000 行或更多行的 1074 个表进行分析,所以我正在寻找一种自动执行此操作的方法,也许是考虑到我想计算奇数和后面的偶数之间的距离这一事实。我不太关心输出格式,但请考虑在我必须 select 之后只有距离 <3.2,所以数据帧格式会很棒。
谢谢! :*
这样的事情怎么样:
首先,我会做一些假数据
set.seed(4304)
df <- data.frame(
x = runif(1000, -1, 1),
y = runif(1000, -1, 1),
z = runif(1000, -1,1)
)
以 2 秒为单位从 1 到数据集的行数创建一个值序列。
s <- seq(1, nrow(df), by=2)
使用sapply()
计算每对点之间的距离。
out <- sapply(s, function(i){
sqrt(sum((df[i,] - df[(i+1), ])^2))
})
将距离组织成数据框
res <- data.frame(
pair = paste(rownames(df)[s], rownames(df)[(s+1)], sep="-"),
dist=out)
head(res)
# pair dist
# 1 1-2 1.379992
# 2 3-4 1.303511
# 3 5-6 1.242302
# 4 7-8 1.257228
# 5 9-10 1.107484
# 6 11-12 1.392247
这是一个可以应用于 data.frame 或保存数据的矩阵的函数。
DistEucl <- function(X){
i <- cumsum(seq_len(nrow(X)) %% 2 == 1)
sapply(split(X, i), function(Y){
sqrt(sum((Y[1, ] - Y[2, ])^2))
})
}
DistEucl(df1)
# 1 2 3 4
#1.229293 1.234273 1.245567 1.195319
使用
out2 <- DistEucl(df)
all.equal(out, out2)
#[1] "names for current but not for target"
identical(out, unname(out2))
#[1] TRUE
题中数据
x <- c(13.457, 13.723, 15.319, 15.713, 18.446, 19.488, 19.762, 19.743)
y <- c(28.513, 29.656, 28.510, 27.342, 28.827, 28.24, 29.841, 30.942)
z <- c(40.513, 40.147, 43.281, 43.218, 43.095, 43.443, 40.094, 40.559)
df1 <- data.frame(x, y, z)