我一直在努力寻找解决此问题的最佳方法。
为了笼统地解决这个问题,并帮助其他可能需要执行类似任务的人,我试图找到一种最佳方法,该方法是根据中间数据集的匹配,并从一个第三数据集中向第三数据集中添加列。第三个数据集的日期范围。最终结果将是将第三个数据集中的匹配值返回第一个数据集中。
以下是示例数据帧的标题,以增加一些清晰度:
> head(SalesData, 10)
sale_id sale_amt int_rate sale_date sale_status
1 1 7000 10.71 2008-05-01 Fully Paid
2 2 10800 13.57 2009-11-01 Fully Paid
3 3 7500 10.08 2008-04-01 Fully Paid
4 4 3000 14.26 2009-09-01 Fully Paid
5 5 5600 14.96 2010-02-01 Charged Off
6 6 2800 11.49 2010-08-01 Fully Paid
7 7 10000 8.59 2009-10-01 Fully Paid
8 8 18000 10.39 2008-03-01 Fully Paid
9 9 5000 15.13 2008-04-01 Fully Paid
10 10 9600 12.29 2008-03-01 Fully Paid
> head(EmployeeSales, 10)
sale_id empl_name empl_num
1 1 Dakota 4
2 2 Dakota 4
3 3 Kami 9
4 4 Adel 1
5 5 Adel 1
6 6 Farah 6
7 7 Kami 9
8 8 Kami 9
9 9 Ida 7
10 10 Kami 9
> head(EmployeeMap, 10)
empl_num empl_name skill_lvl team start_date end_date
1 1 Adel Beg Red 2007-06-01 2008-05-31
2 1 Adel Int Red 2008-06-01 2010-10-31
3 1 Adel Adv Red 2010-11-01 2999-12-12
4 2 Bailey Beg Blue 2010-08-01 2011-04-30
5 2 Bailey Beg Red 2011-05-01 2999-12-12
6 3 Casey Beg Blue 2010-08-01 2010-12-31
7 3 Casey Int Blue 2011-01-01 2999-12-12
8 4 Dakota Beg Red 2007-06-01 2009-08-30
9 4 Dakota Int Red 2009-09-01 2010-08-30
10 4 Dakota Adv Red 2010-09-01 2011-08-30
所需的输出将为每个sale_id将EmployeeMap中的empl_num,sales_team和skill_level添加到SalesData中。
在尝试概念化步骤时,这就是我的想法,但是也许有更好的方法:从SalesData中获取sale_id,将其与Employee Sales中的sale_id匹配,然后获取empl_num。取empl_num并将其与Employee Map中的empl_num匹配。现在,我们需要从SalesData中获取sale_date并找到它属于“ start_date,end_date”的范围。然后,我们将采用匹配的团队和技能级别,并将其添加到SalesData中。
见下表:
> head(df2,10)
sale_id sale_amt int_rate sale_date sale_status empl_num team skill_lvl
1 1 7000 10.71 2008-05-01 Fully Paid 4 Red Beg
2 2 10800 13.57 2009-11-01 Fully Paid 4 Red Int
3 3 7500 10.08 2008-04-01 Fully Paid 9 Blue Beg
4 4 3000 14.26 2009-09-01 Fully Paid 1 Red Int
5 5 5600 14.96 2010-02-01 Charged Off 1 Red Int
6 6 2800 11.49 2010-08-01 Fully Paid 6 Red Beg
7 7 10000 8.59 2009-10-01 Fully Paid 9 Blue Int
8 8 18000 10.39 2008-03-01 Fully Paid 9 Blue Beg
9 9 5000 15.13 2008-04-01 Fully Paid 7 Blue Beg
10 10 9600 12.29 2008-03-01 Fully Paid 9 Blue Int
让我感到复杂的是,在EmployeeMap中,start_date和end_date告诉我们每个员工属于特定技能级别和团队的开始和结束的日期。但是每个员工都改变了技能水平和/或团队,因此每个员工都有多行。
例如,在EmployeeMap的empl_id 1中,我们看到3行告诉我们他们的start_date和end_date,而他们在红队上拥有了Skill_level的Beg,Int,Adv。但是有些人,例如empl_id 2却在保持相同技能水平的同时改变了团队。其他人则改变技能水平和团队。
如果您对解决此问题的最佳方法有任何见解,我将不胜感激。
考虑按日期运行merge
两次,然后subset
按日期运行。在下面,这些呼叫以长长的单线形式嵌套在一起,但可以分开成几行。另外,由于发布的数据是示例行,因此输出小于所需的结果。
# MERGE TWICE AND SUBSET BY DATE
finaldf <- subset(merge(merge(SalesData, EmployeeSales, by="sale_id"),
EmployeeMap, "empl_num", suffixes=c('', '_')),
sale_date >= start_date & sale_date <= end_date)
# SELECT NEEDED COLUMNS
finaldf <- finaldf[c("sale_id", "sale_amt", "int_rate", "sale_date",
"sale_status", "empl_num", "team", "skill_lvl")]
# RE-ORDER BY SALE_ID AND RESET ROW NAMES
finaldf <- with(finaldf, finaldf[order(sale_id),])
row.names(finaldf) <- NULL
finaldf
# sale_id sale_amt int_rate sale_date sale_status empl_num team skill_lvl
# 1 1 7000 10.71 2008-05-01 Fully Paid 4 Red Beg
# 2 2 10800 13.57 2009-11-01 Fully Paid 4 Red Int
# 3 4 3000 14.26 2009-09-01 Fully Paid 1 Red Int
# 4 5 5600 14.96 2010-02-01 Charged Off 1 Red Int
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句