Estoy realizando un análisis de red y tengo datos de ubicación en una columna de "Destino". Quiero rellenar una columna "Fuente" con los datos de destino de la marca de tiempo anterior. es posible?

ID      Date          Year    Month   Day    Time    Target     Source
650     18/07/2019    2019    Jul     18     21:32   Caledonia  NA
650     19/07/2019    2019    Jul     19     23:47   Digby      NA
650     27/07/2019    2019    Jul     27     19:24   Caledonia  NA

Quiero que la columna Fuente se complete con el "Destino" anterior para ese ID.

ID      Date          Year    Month   Day    Time    Target     Source
650     18/07/2019    2019    Jul     18     21:32   Caledonia  NA
650     19/07/2019    2019    Jul     19     23:47   Digby      Caledonia
650     27/07/2019    2019    Jul     27     19:24   Caledonia  Digby
0
Courtney lR 9 oct. 2019 a las 15:02

1 respuesta

La mejor respuesta

Por lo tanto, la función de retraso de dplyr será de gran ayuda para usted.

En el código de ejemplo a continuación, estoy 1) creando una marca de tiempo de fecha y hora 2) Ordenando explícitamente por esta nueva variable para que el retraso pueda saber cuál es el valor anterior 3) Agrupando por ID para que obtengamos el Objetivo retrasado para cada ID por separado 4) ejecutar la función de retraso y especificar cuál debería ser el valor original

library(dplyr)
library(tidyr)
library(tibble)

t <- tibble(
        ID = c(650, 650, 650), 
        Date = c('18/07/2019', '19/07/2019', '27/07/2019'), 
        Time = c('21:32', '23:47', '19:24'), 
        Target = c('Caledonia', 'Digby', 'Caledonia'))

t <- t %>% 
        mutate(date_time = as.POSIXct(
                paste(Date, Time, sep = ' '), 
                format = '%d/%m/%Y %H:%M')) %>%
        arrange(date_time) %>% 
        group_by(ID) %>% 
        mutate(Source = lag(Target, default = NA)) %>% 
        ungroup()

t

     ID Date       Time  Target    date_time           Source   
  <dbl> <chr>      <chr> <chr>     <dttm>              <chr>    
1   650 18/07/2019 21:32 Caledonia 2019-07-18 21:32:00 NA       
2   650 19/07/2019 23:47 Digby     2019-07-19 23:47:00 Caledonia
3   650 27/07/2019 19:24 Caledonia 2019-07-27 19:24:00 Digby  

## to replace initial values with `Target`

t %>% 
        mutate(Source = case_when(
                !is.na(Source) ~ Source,
                is.na(Source) ~ Target))

0
JFlynn 10 oct. 2019 a las 14:54