如何使用DPLYR过滤R中的连接
我正在进行一个项目,以确定服务必须重新工作的次数,但仅限于原始服务结束后的前30天内。使用以下示例数据集:如何使用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',
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