计算R中两个不同数据集中XY坐标之间的距离

时间:2018-02-16 09:54:47

标签: r coordinates distance scatter-plot

考虑我们有两个不同的数据集:

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)

这些数据在此散点图中表示: enter image description here

我想计算df1(黑色空心点)中的7个XY坐标与df2(红色空心三角形)中的7个XY坐标之间的距离。

我知道如何使用dist()和cbind()计算XY坐标within a dataset之间的距离。但我不知道如何做同样的事情,但在两个不同的数据集中使用XY坐标。

使用两个数据集,我们将获得一个由7列和7行组成的表,由所有这些坐标之间的距离填充。列名称是df1中的坐标,行名称是df2中的坐标。

如何使用所有t

获取此数据框

1 个答案:

答案 0 :(得分:1)

也许这个策略可能会有所帮助

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