Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用DPLYR过滤R中的连接_R_Dplyr - Fatal编程技术网

如何使用DPLYR过滤R中的连接

如何使用DPLYR过滤R中的连接,r,dplyr,R,Dplyr,我正在进行一个项目,以确定服务必须重新工作的次数,但仅限于原始服务结束后的前30天内。使用以下示例数据集: work <- tribble( ~Client , ~Initial_Date_In, ~Initial_Date_Out, 'Car1', '2019-01-01', '2019-01-02', 'Car1', '2019-06-01', '2019-06-03', 'Car2', '2019-01-01', '2019-01-02',

我正在进行一个项目,以确定服务必须重新工作的次数,但仅限于原始服务结束后的前30天内。使用以下示例数据集:

work <- tribble(
  ~Client ,  ~Initial_Date_In, ~Initial_Date_Out,
  'Car1',     '2019-01-01', '2019-01-02',
  'Car1',     '2019-06-01', '2019-06-03',
  'Car2',     '2019-01-01', '2019-01-02',
  'Truck1',     '2019-06-01', '2019-06-02',
  'Truck2',     '2019-04-01', '2019-04-02',
  'Truck3',     '2019-08-01', '2019-08-04',
  'Van1',     '2019-01-01', '2019-01-02',
  'Van2',     '2019-06-01', '2019-06-02',
  'Truck4',     '2019-10-05', '2019-10-09',
  
  
)

rework <- tribble(
  ~Client ,  ~Date_In, ~Date_Out,
  'Car1',     '2019-01-05', '2019-01-07',
  'Car1',     '2019-01-09', '2019-01-10',
  'Car1',     '2019-06-09', '2019-06-10',
  'Truck3',     '2019-08-07', '2019-08-08',
  'Van1',     '2019-03-01', '2019-03-01',
  'Van2',     '2019-06-09', '2019-06-11',
  'Truck4',     '2019-11-01', '2019-11-02',
  
  
)

work$Initial_Date_In <- lubridate::as_date(work$Initial_Date_In)
work$Initial_Date_Out <- lubridate::as_date(work$Initial_Date_Out)
rework$Date_In <- lubridate::as_date(rework$Date_In)
rework$Date_Out <- lubridate::as_date(rework$Date_Out)


有关于我做错了什么的提示吗?

更新
这里有一种避免进行任何形式的正式联接的方法。
使用
绑定行
堆叠
工作
返工
,然后使用
服务ix
列(给定
客户端
中服务应用的索引)作为分组/汇总变量:

工作%>%
变异(service=“original”)%%>%
重命名(Date\u In=“Initial\u Date\u In”,Date\u Out=“Initial\u Date\u Out”)%>%
分组依据(客户)%>%
变异(服务号=行号())%>%
绑定行(返工%>%
变异(service=“返工”)%>%
选择(客户端、输入日期、输出日期、服务))%>%
安排(客户,日期)%>%
填充(服务九)%>%
分组依据(客户、服务九)%>%
总结(初始日期=服务中的日期=“原始”],
初始日期=日期[服务==“原始”],
max_date_out=max(date_out),
n_返工=总和(服务=“返工”))%>%
过滤器(n_返工>0)%>%
解组()
稍微开箱:

  • 添加了一个
    服务
    列,指示初始与返工。以下是绑定行()后的组合df:
  • #一个tible:16 x 5
    #组别:客户[8]
    客户日期\u输入日期\u输出服务\u ix
    1 Car1 2019-01-01 2019-01-02原件1
    2 Car1 2019-01-05 2019-01-07返工NA
    3 Car1 2019-01-09 2019-01-10返工NA
    4 Car1 2019-06-01 2019-06-03原件2
    5 Car1 2019-06-09 2019-06-10返工NA
    6 Car2 2019-01-01 2019-01-02原件1
    7卡车2019-06-01 2019-06-02原件1
    8卡车2 2019-04-01 2019-04-02原件1
    9卡车3 2019-08-01 2019-08-04原件1
    10卡车3 2019-08-07 2019-08-08返工NA
    11卡车4 2019-10-05 2019-10-09原件1
    12卡车4 2019-11-01 2019-11-02返工NA
    13 Van1 2019-01-01 2019-01-02原件1
    14 Van1 2019-03-01 2019-03-01返工NA
    15 Van2 2019-06-01 2019-06-02原件1
    16 Van2 2019-06-09 2019-06-11返工NA
    
  • fill
    步骤将替换
    service_ix
    NA值:
  • Client Date\u In Date\u Out service\u ix
    1 Car1 2019-01-01 2019-01-02原件1
    2 Car1 2019-01-05 2019-01-07返工1
    3 Car1 2019-01-09 2019-01-10返工1
    4 Car1 2019-06-01 2019-06-03原件2
    5 Car1 2019-06-09 2019-06-10返工2
    
  • 现在按
    客户
    服务_ix
    分组,并根据需要进行总结
  • #一个tible:6 x 6
    客户服务_ix初始_日期_in初始_date _outmax _date _outn _返工
    1 Car1 2019-01-01 2019-01-02 2019-01-10 2
    2 Car1 2 2019-06-01 2019-06-03 2019-06-10 1
    3卡车2019-08-01 2019-08-04 2019-08-08 1
    4卡车2019-10-05 2019-10-09 2019-11-02 1
    5 Van1 2019-01-01 2019-01-02 2019-03-01 1
    6 Van2 2019-06-01 2019-06-02 2019-06-11 1
    
    使用
    fuzzyjoin
    软件包,您还可以尝试其他方法

    首先,计算
    Date\u End\u Service
    日期,即
    Initial\u Date\u Out
    之后的30天。然后,您可以在
    工作
    返工
    之间执行
    模糊内部连接
    ,在
    客户端
    上进行匹配,并确保
    初始日期
    为% 变更(日期结束服务=初始日期结束+天数(30))%>% 模糊内部连接(返工、, by=c(“客户机”=“客户机”、“初始日期”=“日期”、“日期”=“结束服务”=“日期”), 匹配乐趣=列表(`=`,`=`))%>% 分组人(客户机x,初始日期)%>% 总结(n_service=n()) 输出

      Client.x Initial_Date_In n_service
      <chr>    <date>              <int>
    1 Car1     2019-01-01              2
    2 Car1     2019-06-01              1
    3 Truck3   2019-08-01              1
    4 Truck4   2019-10-05              1
    5 Van2     2019-06-01              1
    
    n_服务中的客户端.x初始日期 1 Car1 2019-01-01 2 2 Car1 2019-06-01 1 3卡车3 2019-08-01 1 4卡车4 2019-10-05 1 5 Van2 2019-06-01 1
    如果您希望计算“服务必须重新工作的次数”,这与您的预期输出有什么关系?例如,
    Car1
    在1月1日的初始工作之后有两个返工服务(1月5日和1月9日)。但这并没有体现在您的预期输出中,它只是显示了最终返工的日期。你能确切地说明你想要得到什么吗?谢谢你的帮助。我更新了预期的输出
    Client    Initial_Date_In    Initial_Date_Out    Date_Out    #_Of_Rework_Visits
    Car1      2019-01-01         2019-01-02          2019-01-10    2
    Car1      2019-06-01         2019-06-03          2019-06-10    1
    Truck3    2019-08-01         2019-08-04          2019-08-08    1
    Van1      2019-06-01         2019-06-02          2019-06-11    1
    Truck4    2019-10-05         2019-10-09          2019-11-02    1
    
    library(tidyverse)
    library(lubridate)
    library(fuzzyjoin)
    
    work %>%
      mutate(Date_End_Service = Initial_Date_Out + days(30)) %>%
      fuzzy_inner_join(rework, 
                       by = c("Client" = "Client", "Initial_Date_Out" = "Date_Out", "Date_End_Service" = "Date_Out"), 
                       match_fun = list(`==`, `<=`, `>=`)) %>%
      group_by(Client.x, Initial_Date_In) %>%
      summarise(n_service = n())
    
      Client.x Initial_Date_In n_service
      <chr>    <date>              <int>
    1 Car1     2019-01-01              2
    2 Car1     2019-06-01              1
    3 Truck3   2019-08-01              1
    4 Truck4   2019-10-05              1
    5 Van2     2019-06-01              1