¿Cómo puedo calcular la distancia entre la latitud y la longitud a lo largo de las filas de columnas en R?

Mi df se ve así:

    bid        ts    latitude  longitude
1  827566 1999-10-07 42.40944 -88.17822
2  827566 2013-04-11 41.84740 -87.63126
3 1902966 2012-05-02 45.52607 -94.20649
4 1902966 2013-03-25 41.94083 -87.65852
5 3211972 2012-08-14 43.04786 -87.96618
6 3211972 2013-08-02 41.88258 -87.63760

Quiero crear un nuevo df que calcule la diferencia en tiempo y distancia de cada punto sucesivo. Me gustaría calcular las filas agrupadas por ofertas que son iguales. Usé lo siguiente para loop para lograr esto:

library(geosphere)
   lengthdata <- nrow(twopoint)
   twopointdata <- data.frame(matrix(ncol = 4, nrow =lengthdata))
   x <- c("bid", "time", "d", "dsq")
   colnames(twopointdata) <- x
   n <- numeric()
   n <- 1

   for (i in 1:lengthdata)
   {
     if (twopoint[i+1,1] == twopoint[i,1]) 
     {
       twopointdata[n,1] <- twopoint[i+1,1]
       twopointdata[n,2] <- as.numeric(twopoint[i+1,5]-twopoint[i,5])
       twopointdata[n,3] <- distm(c(twopoint[i+1,10], twopoint[i+1,9]), 
                              c(twopoint[i,10],twopoint[i,9]), fun = 
                                   distHaversine)
       twopointdata[n,4] <- twopoint[n,3]^2
       n <- n+1
     }

   }
   attach(twopointdata)
   head(twopointdata)

(algunos de los números de columna están desactivados porque saqué algunas filas para mostrarlas más claramente)

Mi resultado se ve así:

      bid time    d          dsq
1  827566 4935  77159.8 5.677201e+11
2 1902966  327 660457.0 6.436004e+16
3 3211972  353 132494.8 3.540118e+12
4 3692174 4722 727359.6 6.394166e+16
5 4404655 4833 201644.7 1.092944e+13
6 6644203 4518 210485.9 6.721980e+16

Tiene los identificadores para cada punto de datos, la diferencia de tiempo entre cada uno, la distancia calculada a partir de largo y lat, y la distancia al cuadrado. PROBLEMA: es muy lento y eventualmente lo haré en un conjunto de datos muy grande.

Pude hacer esto sin un bucle for con éxito con la diferencia horaria usando dplyr como este:

 library(dplyr)
 library(geosphere)
 latlongdata2 <- latlongdata 
 latlongdata2 %>%
  group_by(bid)%>%
  transmute(
    bid = bid,
    t = c(NA,diff(ts)))

No puedo entender cómo hacer esto con la latitud y la longitud porque, a diferencia de los valores ts, están en dos columnas diferentes. ¿Alguien tiene alguna sugerencia?

PD El objetivo general del proyecto es hacer un análisis de desplazamiento cuadrado medio de los datos.

Respuestas a la pregunta(1)

Su respuesta a la pregunta