R 使用lead()和可能的循环添加新变量

R 使用lead()和可能的循环添加新变量,r,R,我有一个名为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 HAR

我有一个名为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
我想添加一个新列,其中保存当前到达日期之后的到达日期。这需要进行不同次数的操作,具体取决于行程中的无支腿。例如,第一份文件.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
当无支腿为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
    ) 
)
test%group\u by(Document.Name)%%>%mutate(
end1=截止日期(如果其他(Leg.Number==1&no_legs==2,lead(Arrival),0),
原点='1970-01-01')
#末端变异
) 
)
但要处理不同的no_legs值,我想我需要一个循环或其他东西。我很确定有一个非常简单的方法来做我想做的事——我就是看不见。想法


提前谢谢。

我想,考虑到每组的腿数,你会让事情变得更加困难。假设您的到达日期按时间顺序排序,则只需按
Document.Name
分组,然后使用
lead
创建新的
end
变量。然后,您只需删除最后的所有行(对于
end
,这将有一个
NA

库(dplyr)
loc_prime2%>%
分组人(文件名)%>%
突变(结束=领先(到达))%>%
选择(Document.Name、locale、Arrival、End、Leg.Number)%>%
过滤器(!is.na(结束))
#>#A tibble:15 x 5
#>#组:Document.Name[4]
#>文档.名称区域设置到达结束段.编号
#>                                             
#>1 VCH028735科罗拉多州丹佛12/2/2018 12/7/2018 1
#>2 VCH028776德克萨斯州哈林根大学2018年12月2日2018年12月3日1
#>3 VCH028776德克萨斯州卢博克大学2018年3月12日2018年4月12日2
#>4 VCH030440田纳西州孟菲斯5/12/2019 5/13/2019 1
#>5 VCH030440田纳西州纳什维尔5/13/2019 5/14/2019 2
#>6 VCH030440田纳西州诺克斯维尔2019年5月14日2019年5月15日3
#>7 VCH030440田纳西州查塔努加5/15/2019 5/16 4
#>8 VCH030440田纳西州纳什维尔5/16/2019 5/18/2019 5
#>9 VCH031580俄勒冈州尤金尤金2019年7月8日2019年7月9日1
#>10 VCH031580俄勒冈州新港2019年7月9日2019年7月10日2
#>11 VCH031580俄勒冈州科瓦利斯7/10/2019 7/11/2019 3
#>12 VCH031580俄勒冈州尤金尤金2019年11月7日2019年12月7日4
#>13 VCH031580加利福尼亚州尤里卡7/12/2019 7/15/2019 5
#>14 VCH031580加利福尼亚州雷丁大学2019年7月15日2019年7月16日6
#>15 VCH031580加利福尼亚州萨克拉门托7/16/2019 7/17 7

不知道R会自己处理不同数量的支腿。艾伦,我想告诉你我在这个问题上工作了多久,但我太尴尬了。谢谢你的帮助。
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