मेरे पास एक शहर में विभिन्न क्षेत्रों के अक्षांश और लंबे समय तक डेटाफ्रेम है।

डेटाफ़्रेम का एक सबसेट:

structure(list(Locality = c("ADYAR", "AMBATTUR", "KOLATHUR", 
"AVADI", "AGARAM", "ANNA NAGAR WEST", "CHROMPET", "MADIPAKKAM", 
"MOGAPPAIR", "MYLAPORE"), Transactions = c(607, 569, 498, 409, 
103, 257, 303, 343, 316, 205), lon = c(80.2564957, 80.1547844, 
80.2121332, 80.0969511, 80.2294222, 80.2017906, 80.1461663, 80.1960832, 
80.1749627, 80.2676303), lat = c(13.0011774, 13.1143393, 13.1239583, 
13.1067448, 13.1116221, 13.0861782, 12.951611, 12.9647462, 13.0837224, 
13.0367914), Ambatturlon = c(80.15478, 80.15478, 80.15478, 80.15478, 
80.15478, 80.15478, 80.15478, 80.15478, 80.15478, 80.15478), 
    Ambatturlat = c(13.11434, 13.11434, 13.11434, 13.11434, 13.11434, 
    13.11434, 13.11434, 13.11434, 13.11434, 13.11434), Guindylon = c(80.22064, 
    80.22064, 80.22064, 80.22064, 80.22064, 80.22064, 80.22064, 
    80.22064, 80.22064, 80.22064), Guindylat = c(13.00666, 13.00666, 
    13.00666, 13.00666, 13.00666, 13.00666, 13.00666, 13.00666, 
    13.00666, 13.00666), OMRlon = c(80.22915, 80.22915, 80.22915, 
    80.22915, 80.22915, 80.22915, 80.22915, 80.22915, 80.22915, 
    80.22915), OMRlat = c(12.91261, 12.91261, 12.91261, 12.91261, 
    12.91261, 12.91261, 12.91261, 12.91261, 12.91261, 12.91261
    )), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"
))
> 
> df
# A tibble: 10 x 10
   Locality        Transactions   lon   lat Ambatturlon Ambatturlat Guindylon Guindylat OMRlon OMRlat
   <chr>                  <dbl> <dbl> <dbl>       <dbl>       <dbl>     <dbl>     <dbl>  <dbl>  <dbl>
 1 ADYAR                    607  80.3  13.0        80.2        13.1      80.2      13.0   80.2   12.9
 2 AMBATTUR                 569  80.2  13.1        80.2        13.1      80.2      13.0   80.2   12.9
 3 KOLATHUR                 498  80.2  13.1        80.2        13.1      80.2      13.0   80.2   12.9
 4 AVADI                    409  80.1  13.1        80.2        13.1      80.2      13.0   80.2   12.9
 5 AGARAM                   103  80.2  13.1        80.2        13.1      80.2      13.0   80.2   12.9
 6 ANNA NAGAR WEST          257  80.2  13.1        80.2        13.1      80.2      13.0   80.2   12.9
 7 CHROMPET                 303  80.1  13.0        80.2        13.1      80.2      13.0   80.2   12.9
 8 MADIPAKKAM               343  80.2  13.0        80.2        13.1      80.2      13.0   80.2   12.9
 9 MOGAPPAIR                316  80.2  13.1        80.2        13.1      80.2      13.0   80.2   12.9
10 MYLAPORE                 205  80.3  13.0        80.2        13.1      80.2      13.0   80.2   12.9
> 

कॉलम अंबाटुर्लोन, अंबत्तुरलाट, गिंडिलॉन आदि एक ही शहर के भीतर के इलाके हैं। मुझे कॉलम में उल्लिखित प्रत्येक इलाके और अन्य इलाकों के बीच की दूरी की गणना करने की आवश्यकता है: (अम्बत्तुरलॉन, अंबत्तुरलाट), (गिंडिलॉन गिंडिलैट), (ओएमआरलॉन ओएमआरलाट)।

मैंने सीखा कि हम इसके लिए जियोस्फीयर पैकेज से डिस्टहावर्सिन फ़ंक्शन का उपयोग कर सकते हैं।

मैंने नीचे दिए गए कोड का उपयोग करके इसे पहले इलाके के लिए आजमाया:

> df %>% 
+   rowwise() %>% 
+     mutate(disttoAmbattur = distHaversine(c(lon, lat), c(Ambatturlon, Ambatturlat)))
Source: local data frame [10 x 11]
Groups: <by row>

# A tibble: 10 x 11
   Locality        Transactions   lon   lat Ambatturlon Ambatturlat Guindylon Guindylat OMRlon OMRlat disttoAmbattur
   <chr>                  <dbl> <dbl> <dbl>       <dbl>       <dbl>     <dbl>     <dbl>  <dbl>  <dbl>          <dbl>
 1 ADYAR                    607  80.3  13.0        80.2        13.1      80.2      13.0   80.2   12.9      16744.   
 2 AMBATTUR                 569  80.2  13.1        80.2        13.1      80.2      13.0   80.2   12.9          0.483
 3 KOLATHUR                 498  80.2  13.1        80.2        13.1      80.2      13.0   80.2   12.9       6309.   
 4 AVADI                    409  80.1  13.1        80.2        13.1      80.2      13.0   80.2   12.9       6326.   
 5 AGARAM                   103  80.2  13.1        80.2        13.1      80.2      13.0   80.2   12.9       8098.   
 6 ANNA NAGAR WEST          257  80.2  13.1        80.2        13.1      80.2      13.0   80.2   12.9       5984.   
 7 CHROMPET                 303  80.1  13.0        80.2        13.1      80.2      13.0   80.2   12.9      18139.   
 8 MADIPAKKAM               343  80.2  13.0        80.2        13.1      80.2      13.0   80.2   12.9      17245.   
 9 MOGAPPAIR                316  80.2  13.1        80.2        13.1      80.2      13.0   80.2   12.9       4050.   
10 MYLAPORE                 205  80.3  13.0        80.2        13.1      80.2      13.0   80.2   12.9      14975.   
> 

मैं मैन्युअल रूप से ऐसा कर सकता था लेकिन ऐसे कई इलाके कॉलम हैं। क्या कोई मुझे बता सकता है कि क्या मैं अन्य इलाकों के माध्यम से लूप कर सकता हूं और सभी इलाकों के कॉलम के प्रत्येक लंबे लंबे संयोजन के लिए disttoAmbattur के समान एक नया कॉलम जोड़ सकता हूं।

1
Karthik S 14 सितंबर 2020, 09:55

1 उत्तर

सबसे बढ़िया उत्तर

हम सभी अक्षांश और देशांतर स्तंभों को एक सदिश में एकत्रित कर सकते हैं और उन्हें समानांतर में पारित करने के लिए map2 का उपयोग कर सकते हैं। प्रत्येक जोड़ी के लिए distHaversine की गणना करें और उन्हें मूल डेटाफ़्रेम में नए कॉलम के रूप में जोड़ें।

library(dplyr)
library(purrr)

lon_col <- grep('.lon', names(df), value = TRUE)
lat_col <- grep('.lat', names(df), value = TRUE)

df %>%
  bind_cols(map2_dfc(lon_col, lat_col, ~{
       newcol <- paste0('dist', sub('lon', '', .x))
       df %>% 
       rowwise() %>% 
       transmute(!!newcol := geosphere::distHaversine(c(lon, lat),
                             c(.data[[.x]], .data[[.y]])))
}))

# A tibble: 10 x 13
#   Locality        Transactions   lon   lat Ambatturlon Ambatturlat Guindylon Guindylat OMRlon OMRlat distAmbattur distGuindy distOMR
#   <chr>                  <dbl> <dbl> <dbl>       <dbl>       <dbl>     <dbl>     <dbl>  <dbl>  <dbl>        <dbl>      <dbl>   <dbl>
# 1 ADYAR                    607  80.3  13.0        80.2        13.1      80.2      13.0   80.2   12.9    16744.         3937.  10296.
# 2 AMBATTUR                 569  80.2  13.1        80.2        13.1      80.2      13.0   80.2   12.9        0.483     13953.  23861.
# 3 KOLATHUR                 498  80.2  13.1        80.2        13.1      80.2      13.0   80.2   12.9     6309.        13090.  23599.
# 4 AVADI                    409  80.1  13.1        80.2        13.1      80.2      13.0   80.2   12.9     6326.        17437.  25935.
# 5 AGARAM                   103  80.2  13.1        80.2        13.1      80.2      13.0   80.2   12.9     8098.        11723.  22154.
# 6 ANNA NAGAR WEST          257  80.2  13.1        80.2        13.1      80.2      13.0   80.2   12.9     5984.         9085.  19548.
# 7 CHROMPET                 303  80.1  13.0        80.2        13.1      80.2      13.0   80.2   12.9    18139.        10140.   9995.
# 8 MADIPAKKAM               343  80.2  13.0        80.2        13.1      80.2      13.0   80.2   12.9    17245.         5373.   6823.
# 9 MOGAPPAIR                316  80.2  13.1        80.2        13.1      80.2      13.0   80.2   12.9     4050.         9906.  19934.
#10 MYLAPORE                 205  80.3  13.0        80.2        13.1      80.2      13.0   80.2   12.9    14975.         6101.  14440.
3
Ronak Shah 14 सितंबर 2020, 10:09