Согласитесь с @utubun, использование dist
является проблемой в вашем примере.
dist
полезно для вычисления расстояния между элементами в матрице. Например:
R> m1 <- matrix(1:8, nrow=4)
R> m1
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
R> dist(m1)
1 2 3
2 1.414214
3 2.828427 1.414214
4 4.242641 2.828427 1.414214
Обратите внимание, что евклидово расстояние между строкой [1,] и строкой [2,] равно 1,4, что аналогично расстоянию между координатами (1,5) и (2, 6) или sqrt(2)
.
В вашем случае вам не нужны матричные сравнения между всеми вашими точками - вас больше всего интересуют расстояния между парами координат в двух матрицах.
Как уже упоминалось @utubun, вам нужно иметь числовые значения c для ваших координат. Например, вы можете сделать:
mat1 <- matrix(apply(dfAB, 1:2, function(x) as.numeric(unlist(strsplit(x, ',')))), ncol = 2, byrow = T)
mat2 <- matrix(apply(dfCD, 1:2, function(x) as.numeric(unlist(strsplit(x, ',')))), ncol = 2, byrow = T)
И это даст вам две числительные c матрицы с 2 столбцами в каждой, которые можно рассматривать как ваши координаты:
R> mat1[1:5,]
[,1] [,2]
[1,] 1 1
[2,] 3 2
[3,] 4 4
[4,] 1 5
[5,] 0 4
R> mat2[1:5,]
[,1] [,2]
[1,] 4 2
[2,] 3 2
[3,] 2 3
[4,] 4 0
[5,] 3 2
Для Получив ваши расстояния, вы можете создать простую функцию для вычисления евклидова расстояния:
euclidean_distance <- function(p, q){
sqrt(sum((p - q)^2))
}
, а затем вызвать функцию построчно через две матрицы пар координат:
matrix(sapply(1:nrow(mat1), function(x) euclidean_distance(mat1[x,], mat2[x,])), ncol = 5, byrow = FALSE)
Что даст вам вашу окончательную матрицу расстояний:
[,1] [,2] [,3] [,4] [,5]
[1,] 3.162278 1.000000 4.472136 1.414214 1.414214
[2,] 0.000000 0.000000 2.236068 1.000000 2.000000
[3,] 2.236068 4.472136 5.385165 1.000000 1.000000
[4,] 5.830952 2.236068 4.242641 3.605551 3.605551
[5,] 3.605551 3.162278 1.000000 1.414214 2.000000
[6,] 2.828427 2.000000 2.000000 2.000000 2.236068
[7,] 1.414214 2.236068 2.236068 2.828427 1.414214
[8,] 1.000000 4.000000 2.828427 2.000000 2.000000
[9,] 3.000000 1.000000 1.000000 2.000000 1.000000
[10,] 2.236068 2.828427 4.123106 1.414214 1.000000
Данные
set.seed(5)
dfA <- data.frame(x = rpois(10,2), y = rpois(10,2), z = rpois(10,2), q = rpois(10,2), t = rpois(10,2))
dfB <- data.frame(x = rpois(10,2), y = rpois(10,2), z = rpois(10,2), q = rpois(10,2), t = rpois(10,2))
dfAB <- map2_df(dfA, dfB, str_c, sep=",") %>%
rename_all(~ str_c('C', seq_along(.)))
dfC <- data.frame(x = rpois(10,2), y = rpois(10,2), z = rpois(10,2), q = rpois(10,2), t = rpois(10,2))
dfD <- data.frame(x = rpois(10,2), y = rpois(10,2), z = rpois(10,2), q = rpois(10,2), t = rpois(10,2))
dfCD <- map2_df(dfC, dfD, str_c, sep=",") %>%
rename_all(~ str_c('C', seq_along(.)))