Добавление новой переменной с помощью lead () и возможного цикла - PullRequest
0 голосов
/ 04 марта 2020

У меня есть набор данных с именем loc_prime2, который выглядит следующим образом:

Document.Name   locale                  Arrival     Leg.Number  no_legs
VCH028735       DENVER_COLORADO         12/2/2018   1           2
VCH028735       _NONE                   12/7/2018   2           2
VCH028776       HARLINGEN_TEXAS         12/2/2018   1           3
VCH028776       LUBBOCK_TEXAS           12/3/2018   2           3
VCH028776       NONE                    12/4/2018   3           3
VCH030440       MEMPHIS_TENNESSEE       5/12/2019   1           6
VCH030440       NASHVILLE_TENNESSEE     5/13/2019   2           6
VCH030440       KNOXVILLE_TENNESSEE     5/14/2019   3           6
VCH030440       CHATTANOOGA_TENNESSEE   5/15/2019   4           6
VCH030440       NASHVILLE_TENNESSEE     5/16/2019   5           6
VCH030440       Kennesaw,               5/18/2019   6           6
VCH031580       EUGENE_OREGON           7/8/2019    1           8
VCH031580       NEWPORT_OREGON          7/9/2019    2           8
VCH031580       CORVALLIS_OREGON        7/10/2019   3           8
VCH031580       EUGENE_OREGON           7/11/2019   4           8
VCH031580       EUREKA_CALIFORNIA       7/12/2019   5           8
VCH031580       REDDING_CALIFORNIA      7/15/2019   6           8
VCH031580       SACRAMENTO_CALIFORNIA   7/16/2019   7           8
VCH031580       _NONE                   7/17/2019   8           8

Я хочу добавить новый столбец, который содержит дату прибытия, следующую за текущей датой прибытия. Это должно быть сделано разное количество раз в зависимости от no_legs в поездке. Например, первый Document.Name был в Денвере 12/2; следующее местоположение, связанное с Document.Name - _None, означающее, что после Денвера не было пункта назначения. Таким образом, строка для VCH028735 должна быть сокращена до:

Document.Name    locale            Arrival    End        
VCH028735        DENVER_COLORADO   12/2/2018  12/7/2018  

Обратите внимание, что в некоторых поездках более двух ветвей. Есть поездки с целых 8 ногами. Например, VCH031580 необходимо сжать до этого:

 Document.Name    locale                  Arrival    End        
 VCH031580        EUGENE_OREGON           7/8/2019  7/9/2019
 VCH031580        NEWPORT_OREGON          7/9/2019  7/10/2019
 VCH031580        CORVALLIS_OREGON        7/10/2019  7/11/2019
 VCH031580        EUGENE_OREGON           7/11/2019  7/12/2019
 VCH031580        EUREKA_CALIFORNIA       7/12/2019  7/15/2019
 VCH031580        REDDING_CALIFORNIA      7/15/2019  7/16/2019
 VCH031580        SACRAMENTO_CALIFORNIA   7/16/2019  7/17/2019

У меня есть это для случая, когда no_legs равен 2:

test <- as.data.frame(loc_prime2 %>% group_by(Document.Name) %>% mutate(
    end1 = as.Date(ifelse(Leg.Number == 1 & no_legs == 2, lead(Arrival), 0), 
    origin = '1970-01-01')

    # end mutate
    ) 
)

Но для работы с различными значениями no_legs Я думаю, мне понадобится все, что угодно. Я уверен, что есть очень простой способ сделать то, что я хочу - я просто не вижу этого. Мысли?

Заранее спасибо.

1 Ответ

0 голосов
/ 04 марта 2020

Я думаю, что вы усложняете, думая о количестве ног в группе. Предполагая, что даты вашего прибытия отсортированы по времени, все, что вам нужно сделать, это сгруппировать по Document.Name, а затем использовать lead для создания новой переменной end. Затем вы просто удаляете все последние строки (которые будут иметь NA для end)

library(dplyr)

loc_prime2 %>% 
  group_by(Document.Name) %>% 
  mutate(End = lead(Arrival)) %>% 
  select(Document.Name, locale, Arrival, End, Leg.Number) %>%
  filter(!is.na(End))

#> # A tibble: 15 x 5
#> # Groups:   Document.Name [4]
#>    Document.Name locale                Arrival   End       Leg.Number
#>    <chr>         <chr>                 <chr>     <chr>          <int>
#>  1 VCH028735     DENVER_COLORADO       12/2/2018 12/7/2018          1
#>  2 VCH028776     HARLINGEN_TEXAS       12/2/2018 12/3/2018          1
#>  3 VCH028776     LUBBOCK_TEXAS         12/3/2018 12/4/2018          2
#>  4 VCH030440     MEMPHIS_TENNESSEE     5/12/2019 5/13/2019          1
#>  5 VCH030440     NASHVILLE_TENNESSEE   5/13/2019 5/14/2019          2
#>  6 VCH030440     KNOXVILLE_TENNESSEE   5/14/2019 5/15/2019          3
#>  7 VCH030440     CHATTANOOGA_TENNESSEE 5/15/2019 5/16/2019          4
#>  8 VCH030440     NASHVILLE_TENNESSEE   5/16/2019 5/18/2019          5
#>  9 VCH031580     EUGENE_OREGON         7/8/2019  7/9/2019           1
#> 10 VCH031580     NEWPORT_OREGON        7/9/2019  7/10/2019          2
#> 11 VCH031580     CORVALLIS_OREGON      7/10/2019 7/11/2019          3
#> 12 VCH031580     EUGENE_OREGON         7/11/2019 7/12/2019          4
#> 13 VCH031580     EUREKA_CALIFORNIA     7/12/2019 7/15/2019          5
#> 14 VCH031580     REDDING_CALIFORNIA    7/15/2019 7/16/2019          6
#> 15 VCH031580     SACRAMENTO_CALIFORNIA 7/16/2019 7/17/2019          7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...