0

Mi DF cuenta con viajes de un día entero en transporte público para los que tengo los orígenes de cada viaje y necesito asignar un destino que será el origen del siguiente viaje de una misma tarjeta (pasajero). Al último viaje del día le asignaré el origen del primer viaje.
Tengo un DF de 300mil filas y este código me está llevando media hora en R.

dfo2$contar<-cumcount(dfo2$NroTarjeta)
    for (i in 2:length(dfo2$NroTarjeta)) 
     { if(dfo2$NroTarjeta[i]==dfo2$NroTarjeta[i-1])
     { dfo2$latdestino[i-1]<-dfo2$Latitude[i]    
      dfo2$londestino[i-1]<-dfo2$Longitude[i]   
     } else
      {dfo2$latdestino[i-1]<-dfo2$Latitude[(i-1)-dfo2$contar[i-1]+1]
       dfo2$londestino[i-1]<-dfo2$Longitude[(i-1)-dfo2$contar[i-1]+1]
       }
       }
1

1 respuesta 1

0

En R no son tan necesarios los ciclos como en otros lenguajes

En R se usa vectorización

entonces…

for( i in 1:n ){ un_vector[ i ] }

cambia a

un_vector[ 1:n ]

por ejemplo:

dfo2$contar <- cumcount( dfo2$NroTarjeta )

N <- length( dfo2$NroTarjeta )

# vector de filas
iguales <- which(
  dfo2$NroTarjeta[ 1:(N - 1) ] == dfo2$NroTarjeta[ 2:N ]
)

# otro vector de filas
no_son_iguales <- which(
  dfo2$NroTarjeta[ 1:(N - 1) ] != dfo2$NroTarjeta[ 2:N ]
)

# Expresiónes vectorizadas

dfo2$latdestino[ iguales ] <- dfo2$Latitude[ iguales + 1 ]    
dfo2$londestino[ iguales ] <- dfo2$Longitude[ iguales + 1 ]
      
dfo2$latdestino[ no_son_iguales ] <- dfo2$Latitude[ ( no_son_iguales ) -
    dfo2$contar[ no_son_iguales ] + 1 ]
dfo2$londestino[ no_son_iguales ] <- dfo2$Longitude[ ( no_son_iguales ) -
    dfo2$contar[ no_son_iguales ] + 1 ]
1
  • Me solucionó el inconveniente perfectamente. Muchas gracias!
    – Yanina G
    Commented el 28 nov. 2022 a las 17:55

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.