Jarak antar titik di R: distCosine() untuk sebuah tabel?

Saya memiliki daftar posisi dan saya ingin mengetahui jarak antara titik terdekat. Saya mencoba menggunakan distCosine() tetapi ada masalah. Inilah yang saya lakukan:

  1. data saya, diurutkan berdasarkan lat

    structure(list(lat = c(53.56478, 53.919724, 54.109047, 54.109047, 
    54.36612, 55.48143, 56.2335, 56.682796, 56.93616, 57.804092, 
    58.82089, 59.297623, 59.335075, 59.907795, 60.125046, 60.274445, 
    60.289204, 60.386665, 60.591167, 64.68329), long = c(14.585611, 
    14.286517, 13.807847, 13.807847, 10.997632, 18.182697, 16.454927, 
    16.564703, 18.221214, 23.258204, 17.84381, 18.172949, 18.126884, 
    23.217615, 20.65724, 26.44062, 27.189545, 19.847534, 28.5585, 
    24.534185)), .Names = c("lat", "long"), row.names = c(2L, 3L, 
    6L, 11L, 1L, 17L, 15L, 20L, 13L, 19L, 7L, 14L, 4L, 5L, 10L, 12L, 
    18L, 9L, 8L, 16L), class = "data.frame")
    
  2. Saya mencoba menggunakan distCosine() setelah diskusi lain tentang stackoverflow untuk memasukkan jarak dari lintang terdekat ke dalam kolom baru (inilah sebabnya saya mengurutkan berdasarkan lintang):

data$a‹-outer(seq(nrow(data)), seq(nrow(data)), Vektorisasi(fungsi(i, j) distCosine(data[1,], data[2,])) )

Hasilnya tidak berhasil... Ini bukan jarak setiap titik...

apakah ada cara yang lebih mudah untuk menggunakan distCosine untuk permintaan saya?


person Floni    schedule 12.01.2016    source sumber
comment
Saya sebenarnya tidak terlalu jauh dengan data$a ‹- ​​distCosine(p1 = pts[-nrow(pts),], p2 = pts[-1,]) tetapi saya mengalami kesalahan karena tidak ada apa pun untuk baris pertama.. .   -  person Floni    schedule 12.01.2016


Jawaban (2)


Saya pikir Anda hanya perlu mengganti distCosine(data[1,], data[2,]) dengan distCosine(data[i,c("long","lat")], data[j,c("long","lat")]):

data <- head(data,5)  # smaller example

data$a<-outer( seq(nrow(data)), 
               seq(nrow(data)), 
               Vectorize(
                 function(i, j) distCosine(data[i,c("long","lat")], data[j,c("long","lat")])
                 ) 
               )

Hasil:

> data
        lat     long       a.1       a.2       a.3       a.4       a.5
2  53.56478 14.58561      0.00  44146.92  79251.87  79251.87 251291.54
3  53.91972 14.28652  44146.92      0.00  37741.81  37741.81 220118.16
6  54.10905 13.80785  79251.87  37741.81      0.00      0.00 185040.01
11 54.10905 13.80785  79251.87  37741.81      0.00      0.00 185040.01
1  54.36612 10.99763 251291.54 220118.16 185040.01 185040.01      0.00
> 
person mra68    schedule 12.01.2016

Mengerti dengan fungsi lain:

 data<-data[c("long","lat")]

 distHaversine
 t<-distHaversine(p1 = data[-nrow(data),], 
 p2 = data[-1,]) a<-0 final<-c(a,t) data$dist<-final
 a<-0
 final<-c(a,t)
 data$dist<-final
person Floni    schedule 12.01.2016