基于匹配多个数据集的多个条件和日期范围添加列

P_艾伦

我一直在努力寻找解决此问题的最佳方法。

为了笼统地解决这个问题,并帮助其他可能需要执行类似任务的人,我试图找到一种最佳方法,该方法是根据中间数据集的匹配,并从一个第三数据集中向第三数据集中添加列。第三个数据集的日期范围。最终结果将是将第三个数据集中的匹配值返回第一个数据集中。

以下是示例数据帧的标题,以增加一些清晰度:

> 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

基于多个条件匹配两个数据帧的行

基于行或列匹配的多个数据框的子集列表

基于一列添加多个数据框

将基于三列匹配值的多个数据框合并为单个数据框

基于多个日期条件过滤数据框

AmCharts股票图表多个数据集日期范围不正确

熊猫索引将多个数据框与多个条件匹配

如何基于多个列添加条件计数

基于多个条件添加新列

循环遍历多个数据集和多个列,但缺少一个变量

在2个数据集之间匹配列中的值,更新多个列

R基于添加条件的特定列合并两个数据集

R - 基于多列匹配合并多个数据帧

将lapply与for和if..else语句结合使用可将条件列添加到多个数据框

如何基于一系列if \ else条件和匹配值从多个数据帧中最佳提取信息?(需要指导!)

创建具有多个数据框和多个条件的列

基于两个数据帧 R 中多个条件的特定列的值

R:根据多个列的匹配将一个列从一个数据集添加到另一个

根据日期范围合并多个数据框

基于匹配行条件和共享列合并两个数据帧

基于 if 条件在 $.ajax 中传递多个数据

在以多个数据帧列为条件的数据帧中添加一列

多个日期范围的条件连接

如何基于R中的多个条件创建新的数据集?

匹配多个数据框之间的子字符串和单独列中的加权总和

Google 表格查询 - 多个条件和日期范围

熊猫基于多个列的两个数据框子集

通过匹配多个条件在一个数据框中基于另一个数据框过滤记录

如何在同一组轴上的不同范围内融合和绘制多个数据集?