计算 R 中两个不同数据集的 XY 坐标之间的距离
Calculate distances between XY coordinates in two different datasets in R
假设我们有两个不同的数据集:
X1 = c(1,2,4,5,1,3,1)
Y1 = c(3,5,6,3,1,5,1)
df1= data.frame(X1,Y1)
X2 = c(2,3,4,3,2,3,2)
Y2 = c(3,4,2,6,4,3,4)
df2= data.frame(X2,Y2)
这些数据在此散点图中表示:
我想计算 df1 中的 7 个 XY 坐标(黑色空心圆点)和 df2 中的 7 个 XY 坐标(红色空心三角形)之间的距离。
我知道如何使用 dist() 和 cbind() 计算 XY 坐标之间的距离 within a dataset。但是我不知道如何在两个不同的数据集中使用 XY 坐标来做同样的事情。
使用两个数据集,我们将获得一个由 7 列和 7 行组成的 table,由所有这些坐标之间的距离填充。列名是 df1 中的坐标,行名是 df2 中的坐标。
如何获得包含所有 t
的数据框
也许这个策略会有所帮助
X1 = c(1,2,4,5,1,3,1)
Y1 = c(3,5,6,3,1,5,1)
df1= data.frame(X1,Y1)
X2 = c(2,3,4,3,2,3,2)
Y2 = c(3,4,2,6,4,3,4)
df2= data.frame(X2,Y2)
library(tidyverse)
df1 = df1 %>% mutate(df_type = "data1") %>% select(X = X1, Y = Y1)
df2 = df2 %>% mutate(df_type = "data2") %>% select(X = X2, Y = Y2)
# link data frames by row
df = bind_rows(df1, df2)
dist(cbind(df$X,df$Y))
1 2 3 4 5 6 7 8 9 10 11 12 13
2 2.236068
3 4.242641 2.236068
4 4.000000 3.605551 3.162278
5 2.000000 4.123106 5.830952 4.472136
6 2.828427 1.000000 1.414214 2.828427 4.472136
7 2.000000 4.123106 5.830952 4.472136 0.000000 4.472136
8 1.000000 2.000000 3.605551 3.000000 2.236068 2.236068 2.236068
9 2.236068 1.414214 2.236068 2.236068 3.605551 1.000000 3.605551 1.414214
10 3.162278 3.605551 4.000000 1.414214 3.162278 3.162278 3.162278 2.236068 2.236068
11 3.605551 1.414214 1.000000 3.605551 5.385165 1.000000 5.385165 3.162278 2.000000 4.123106
12 1.414214 1.000000 2.828427 3.162278 3.162278 1.414214 3.162278 1.000000 1.000000 2.828427 2.236068
13 2.000000 2.236068 3.162278 2.000000 2.828427 2.000000 2.828427 1.000000 1.000000 1.414214 3.000000 1.414214
14 1.414214 1.000000 2.828427 3.162278 3.162278 1.414214 3.162278 1.000000 1.000000 2.828427 2.236068 0.000000 1.414214
然后你可以用X和Y之间的距离创建一个data.frame。首先我们需要将dist
对象转换成一个数据框
df_dist = data.frame(as.matrix(dist(cbind(df$X,df$Y))))
做一些操作可以得到 X 和 Y 之间的距离
df_dist_x = df_dist %>% select(X1:X7) %>%
mutate(row.1 = 1:nrow(df_dist)) %>%
filter(row.1 >= 8) %>%
mutate(Y = paste0("Y",row_number())) %>%
gather(X, distance, X1:X7) %>%
select(X, Y, distance)
head(df_dist_x)
X Y distance
1 X1 Y1 1.000000
2 X1 Y2 2.236068
3 X1 Y3 3.162278
4 X1 Y4 3.605551
5 X1 Y5 1.414214
6 X1 Y6 2.000000
假设我们有两个不同的数据集:
X1 = c(1,2,4,5,1,3,1)
Y1 = c(3,5,6,3,1,5,1)
df1= data.frame(X1,Y1)
X2 = c(2,3,4,3,2,3,2)
Y2 = c(3,4,2,6,4,3,4)
df2= data.frame(X2,Y2)
这些数据在此散点图中表示:
我想计算 df1 中的 7 个 XY 坐标(黑色空心圆点)和 df2 中的 7 个 XY 坐标(红色空心三角形)之间的距离。
我知道如何使用 dist() 和 cbind() 计算 XY 坐标之间的距离 within a dataset。但是我不知道如何在两个不同的数据集中使用 XY 坐标来做同样的事情。
使用两个数据集,我们将获得一个由 7 列和 7 行组成的 table,由所有这些坐标之间的距离填充。列名是 df1 中的坐标,行名是 df2 中的坐标。
如何获得包含所有 t
的数据框也许这个策略会有所帮助
X1 = c(1,2,4,5,1,3,1)
Y1 = c(3,5,6,3,1,5,1)
df1= data.frame(X1,Y1)
X2 = c(2,3,4,3,2,3,2)
Y2 = c(3,4,2,6,4,3,4)
df2= data.frame(X2,Y2)
library(tidyverse)
df1 = df1 %>% mutate(df_type = "data1") %>% select(X = X1, Y = Y1)
df2 = df2 %>% mutate(df_type = "data2") %>% select(X = X2, Y = Y2)
# link data frames by row
df = bind_rows(df1, df2)
dist(cbind(df$X,df$Y))
1 2 3 4 5 6 7 8 9 10 11 12 13
2 2.236068
3 4.242641 2.236068
4 4.000000 3.605551 3.162278
5 2.000000 4.123106 5.830952 4.472136
6 2.828427 1.000000 1.414214 2.828427 4.472136
7 2.000000 4.123106 5.830952 4.472136 0.000000 4.472136
8 1.000000 2.000000 3.605551 3.000000 2.236068 2.236068 2.236068
9 2.236068 1.414214 2.236068 2.236068 3.605551 1.000000 3.605551 1.414214
10 3.162278 3.605551 4.000000 1.414214 3.162278 3.162278 3.162278 2.236068 2.236068
11 3.605551 1.414214 1.000000 3.605551 5.385165 1.000000 5.385165 3.162278 2.000000 4.123106
12 1.414214 1.000000 2.828427 3.162278 3.162278 1.414214 3.162278 1.000000 1.000000 2.828427 2.236068
13 2.000000 2.236068 3.162278 2.000000 2.828427 2.000000 2.828427 1.000000 1.000000 1.414214 3.000000 1.414214
14 1.414214 1.000000 2.828427 3.162278 3.162278 1.414214 3.162278 1.000000 1.000000 2.828427 2.236068 0.000000 1.414214
然后你可以用X和Y之间的距离创建一个data.frame。首先我们需要将dist
对象转换成一个数据框
df_dist = data.frame(as.matrix(dist(cbind(df$X,df$Y))))
做一些操作可以得到 X 和 Y 之间的距离
df_dist_x = df_dist %>% select(X1:X7) %>%
mutate(row.1 = 1:nrow(df_dist)) %>%
filter(row.1 >= 8) %>%
mutate(Y = paste0("Y",row_number())) %>%
gather(X, distance, X1:X7) %>%
select(X, Y, distance)
head(df_dist_x)
X Y distance
1 X1 Y1 1.000000
2 X1 Y2 2.236068
3 X1 Y3 3.162278
4 X1 Y4 3.605551
5 X1 Y5 1.414214
6 X1 Y6 2.000000