समूह द्वारा लगातार पंक्तियों के बीच की दूरी की गणना करें [डुप्लिकेट]
सुबह दोपहर शाम
मेरे पास निम्नलिखित नाव डेटा है:
set.seed(123)
df <- data.frame(
fac = as.factor(c("A", "A", "A", "A",
"B", "B", "B",
"C", "C", "C", "C", "C")),
lat = runif(12, min = 45, max = 47),
lon = runif(12, min = -6, max = -5 ))
मैं कारक चर द्वारा डेटा समूह fac
।
library(dplyr)
df_grouped <- df %>%
group_by(fac) %>%
summarise(first_lon = first(lon),
last_lon = last(lon),
first_lat = first(lat),
last_lat = last(lat))
मैं पॉलीगोन बनाने के लिए पहले और अंतिम अक्षांश ( lat
) और अनुदैर्ध्य ( lon
) का उपयोग करता हूं
मैं बहुभुज के पार की दूरी का अनुमान लगाने के लिए पहली और आखिरी अक्षांश ( lat
) और देशांतर ( lon
) का भी उपयोग करता हूं ।
library(geosphere)
df_grouped %>%
mutate(distance_m = distHaversine(matrix(c(first_lon, first_lat), ncol = 2),
matrix(c(last_lon, last_lat), ncol = 2)))
यद्यपि यह मानता है कि नाव बहुभुज के भीतर सबसे लंबी दूरी तक एक सीधी रेखा में जाती है।
यह हमेशा सच नहीं होता है, कभी-कभी यह थोड़ा के बारे में बताता है:
मैं क्या करना चाहूंगा कि वास्तविक दूरी है नाव एक समूह के साथ प्रत्येक पंक्ति के बीच की दूरी काम करके यात्रा की है।
या दूसरे शब्दों में:
उदाहरण के लिए fac == "C"
, नाव ने x
मीटर की यात्रा की होगी , जहां x
समूह के भीतर प्रत्येक डेटा बिंदु के बीच की दूरी से गणना की जाती है।
जवाब
प्रयत्न :
df %>% group_by(fac) %>%
mutate(lat_prev = lag(lat,1), lon_prev = lag(lon,1) ) %>%
mutate(dist = distHaversine(matrix(c(lon_prev, lat_prev), ncol = 2),
matrix(c(lon, lat), ncol = 2))) %>%
summarize(dist = sum(dist,na.rm=T))
# A tibble: 3 x 2
fac dist
<fct> <dbl>
1 A 93708.
2 B 219742.
3 C 347578.
हेनरिक द्वारा सुझाए गए अनुसार बहुत बेहतर:
df %>% group_by(fac) %>%
summarize(dist = distHaversine(cbind(lon, lat))) %>%
summarize(dist = sum(dist,na.rm=T))
dplyr::lag
पिछली पंक्ति से मूल्य खींच लेंगे। फिर आप उन मानों को दूसरी गणना के लिए पास कर सकते हैं ताकि दूरी की गणना कर सकें (ये संभवत: विशिष्ट गणना नहीं हैं जो आप चाहते हैं, लेकिन यह सामान्य तकनीक दिखाता है):
library(dplyr)
df %>%
group_by(fac) %>%
mutate(lag_lat = lag(lat), lag_lon = lag(lon)) %>%
mutate(dist_lat = lat - lag_lat, dist_lon = lon - lag_lon)
ध्यान दें कि lag
पंक्तियों के क्रम के प्रति संवेदनशील है। सुनिश्चित करें कि वे अस्थायी क्रम में हैं।