Saya memiliki kumpulan data bernama loc_prime2 yang terlihat seperti ini:

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

Saya ingin menambahkan kolom baru yang menyimpan tanggal kedatangan setelah tanggal kedatangan saat ini. Ini perlu dilakukan beberapa kali berbeda tergantung pada no_legs dalam perjalanan. Misalnya, Document.Name pertama ada di Denver pada 12/2; lokasi berikutnya yang terkait dengan Document.Name adalah _None yang berarti tidak ada tujuan setelah Denver. Jadi baris untuk VCH028735 harus diringkas menjadi:

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

Perhatikan, beberapa perjalanan memiliki lebih dari 2 kaki. Ada perjalanan dengan sebanyak 8 kaki. Misalnya, VCH031580 perlu diringkas menjadi ini:

 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

Saya memiliki ini untuk kasus ketika no_legs adalah 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
    ) 
)

Tetapi untuk menangani nilai no_legs yang berbeda, saya pikir saya akan membutuhkan loop atau sesuatu. Saya cukup yakin ada cara yang sangat mudah untuk melakukan apa yang saya inginkan--saya tidak bisa melihatnya. Pikiran?

Terima kasih sebelumnya.

r
0
wolf7687 4 Maret 2020, 19:27

1 menjawab

Jawaban Terbaik

Saya pikir Anda membuatnya lebih sulit dengan memikirkan jumlah kaki per kelompok. Dengan asumsi tanggal kedatangan Anda diurutkan dalam urutan waktu, yang perlu Anda lakukan hanyalah mengelompokkan menurutDocument.Name, lalu gunakan lead untuk membuat variabel end baru. Anda kemudian cukup menghapus semua baris terakhir (yang akan memiliki NA untuk 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
0
Allan Cameron 4 Maret 2020, 16:53