简体   繁体   中英

How to measure distances between certain pairs of (pixel) coordinates in R?

I have a dataset of 22 point coordinates (points represent landmarks on photo of fish-lateral view).

I would like to measure 24 distances between these points (24 different measurements). For example distance between point 1 and 5 and so on.

And I would like to make a loop from it (always will measure the same set of 24 distances - I have 2000 of such lists of coordinates where I have to measure these 24 distances).

I tried "dist" function (see below) and it gave me all possible measurements between all points.

getwd()
setwd("C:/Users/jakub/merania")
LCmeasure <- read.csv("LC_meranie2.csv", sep = ";", dec = ",", header = T)
LCmeasure
head(LCmeasure)
names(LCmeasure)

> LCmeasure
   point       x          y
1    1 1724.00000 1747.00000
2    2 1864.00000 1637.00000
3    3 1862.00000 1760.00000
4    4 2004.00000 1757.00000
5    5 2077.00000 1533.00000
6    6 2134.00000 1933.00000
7    7 2293.00000 1699.00000
8    8 2282.00000 1588.00000
9    9 2728.00000 1576.00000
10  10 2922.00000 1440.00000
11  11 3018.00000 1990.00000
12  12 3282.00000 1927.00000
13  13 3435.00000 1462.00000
14  14 3629.00000 1548.00000
15  15 3948.00000 1826.00000
16  16 3935.00000 1571.00000
17  17 4463.00000 1700.00000
18  18 4661.00000 1978.00000
19  19 4671.00000 1445.00000
20  20 4101.00000 1699.00000
21  21 2203.00000 2806.00000
22  22 4772.00000 2788.00000

df= data.frame(LCmeasure)
df
dflibrary(tidyverse)
dist(df[,-1])

Points <- data.frame(p1=c(1,1,1,3,4,5,1,1,1,7,10,10,11,12,12,14,15,11,13,7,20,20,20,1),p2=c(8,2,3,4,8,6,11,10,13,10,13,11,13,13,20,20,16,12,14,9,18,17,19,20))
Points

Dists <- Points %>% rowwise() %>% mutate(dist=dist(filter(LCmeasure, Point %in% c(p1,p2))))
Dists

Now I need to specify in R to measure for me only those specific 24 distances. For example between point 1 and 5, then between point 2 and 10, and so on.

And to make a loop from it (always will be the same set of 24 distances measured).

Here is my solution to your problem:

Generate a new dataframe with your desired pairs of points and then use dplyr to generate distances based on those points:

library(tidyverse)
Points <- data.frame(p1=c(1,2,4,5,6),p2=c(5,10,14,15,17))

Dists <- Points %>% rowwise() %>% mutate(dist=dist(filter(LCMeasure, point %in% c(p1,p2))))

> Dists
>     p1    p2  dist
>  <dbl> <dbl> <dbl>
> 1     1     5  413.
> 2     2    10 1076.
> 3     4    14 1638.
> 4     5    15 1894.
> 5     6    17 2341.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM