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

2024-01-14

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

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

以下是示例数据帧的头部,以增加清晰度:

> 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

所需的输出会将 EmployeeMap 中的 empl_num、sales_team 和 Skill_level 添加到每个 sale_id 的 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 告诉我们每个员工开始和结束属于特定技能水平和团队的日期。但每个员工都改变了技能水平和/或团队,因此每个员工都有多行。

例如,在 empl_id 1 的 EmployeeMap 中,我们可以看到 3 行告诉我们他们的开始日期和结束日期,而他们的技能级别 Beg、Int、Adv 都属于红队。但有些人(例如 empl_id 2)会在保持相同技能水平的情况下更换团队。其他人则改变技能水平和团队。

如果您对解决此问题的最佳方法有任何见解,我将不胜感激。


也许实现这一点的最简单方法是使用两个类似 SQL 的连接(我建议你给出一些像这样 https://en.wikipedia.org/wiki/Join_(SQL)如果您不熟悉连接/关系代数,请阅读)。

许多连接可以通过merge基础 R 和许多其他流行软件包中的函数(dplyr, data.table, sqldf,仅举几例)在连接操作中提供替代语法或扩展功能。

您的两个连接中的第一个(在SalesData and EmployeeSales)可以很容易地完成merge:

merge(SalesData, EmployeeSales, by = "sale_id")

#    sale_id sale_amt int_rate  sale_date sale_status empl_name empl_num
# 1        1     7000    10.71 2008-05-01  Fully Paid    Dakota        4
# 2        2    10800    13.57 2009-11-01  Fully Paid    Dakota        4
# 3        3     7500    10.08 2008-04-01  Fully Paid      Kami        9
# ...

然而,第二个连接更为复杂,因为它不是典型的连接等值连接 https://en.wikipedia.org/wiki/Join_(SQL)#Equi-join。相反,连接逻辑需要在以下位置查找行:EmployeeMap where start_date小于sale_date and end date大于它(除了相等条件empl_num).

幸运的是,前面提到的data.table https://rstudio-pubs-static.s3.amazonaws.com/52230_5ae0d25125b544caab32f75f0360e775.html包提供了应用所述逻辑的能力。

library(data.table)

# convert all three dataframes to data.table objects
setDT(SalesData) ; setDT(EmployeeSales) ; setDT(EmployeeMap)

EmployeeMap[SalesData[EmployeeSales[, c("sale_id","empl_num")],
                      on = "sale_id"], 
            on = .(empl_num, start_date <= sale_date, end_date >= sale_date)]

#    empl_num empl_name skill_lvl team start_date   end_date sale_id sale_amt int_rate sale_status
# 1:        4    Dakota       Beg  Red 2008-05-01 2008-05-01       1     7000    10.71  Fully Paid
# 2:        4    Dakota       Int  Red 2009-11-01 2009-11-01       2    10800    13.57  Fully Paid
# 3:        9        NA        NA   NA 2008-04-01 2008-04-01       3     7500    10.08  Fully Paid
# ...

请注意,为了进行比较,所有三个日期列都应该是日期类型,而不是字符串。另请注意,NA上面输出中的值是快照的结果EmployeeMap问题中提供,仅映射empl_num 1-4.

我还建议阅读以下答案这个问题 https://stackoverflow.com/questions/23934361/merge-2-dataframes-if-value-within-range有关如何在日期范围内加入的更多背景信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 在 R 中创建缓冲区和计数点

    I asked 这个问题 https stackoverflow com questions 42498344 create buffer around spatial point data in r and count how many
  • 在R中使用pandoc将.docx转换为.md时如何保留标题和副标题?

    我正在下载一个 docx 格式的 Google 文档 然后转换为 Markdown 进行操作并导出为多种格式 问题 当我使用 pandoc 进行转换时 它会删除标题 和副标题 并且不添加任何 YAML 标头信息 我可以在标头中手动添加标题
  • 如何将闪亮 UI 输入框中的值传递回 R 脚本中的变量并运行它?

    我有以下代码source R我正打算逃离闪亮的 目前脚本中有硬编码值 例如 10000 55 15 200 等 以及这些值下面的一些矩阵相关元素 rnorm2 lt function n mean sd mean sd scale rnor
  • R 中的自定义对比:对比系数矩阵或对比矩阵/编码方案?以及如何到达那里?

    自定义对比在分析中应用非常广泛 例如 这个三水平因子的第 1 级和第 3 级的 DV 值是否有显着差异 直观上 这种对比用单元均值表示为 c 1 0 1 这些对比中的一个或多个 以列的形式绑定 形成对比系数矩阵 例如 mat matrix
  • 自动使用 LRT 评估整个因子变量的显着性

    包含一个或多个因子变量的多变量回归模型的 R 输出不会自动包含模型中整个因子变量的显着性的似然比检验 LRT 例如 fake data frame x1 rnorm 100 x2 sample LETTERS 1 4 size 100 re
  • 如何在 R 中导入并绘制三角形网格?

    我想在 R 中绘制我的模型输出 它是格式为的三角形网格 x1 y1 z1 x2 y2 z2 x3 y3 z3 value 每行代表一个三角形 我想用以下方法绘制这些三角形value作为规模 mymesh lt structure c 0 9
  • 输出到文件时光栅图的分辨率较差

    我有一个相当高清晰度的全球地图栅格 想要绘制到文件 但似乎无法保持分辨率 绘制受限区域效果很好 但无论我使用什么方法 整个世界总是以降低的分辨率告终 我在这里错过了什么吗 我以前经常输出高分辨率栅格而没有出现此问题 但在这种情况下我无法确定
  • 如何在 R 中调整/控制树形图中的比例(使用“portfolio”库)?

    我正在使用 R 和 portfolio 库来构建树形图 比例默认为 1000 到 1000 例如 我需要它是 0到1000 我知道 map market 有一个 scale 参数 但我不知道要传递给它什么 围绕零的对称颜色映射被硬编码到ma
  • 使用 tidyverse 在 tibble 中“取消嵌套” data.frame 列

    我正在处理从 www 调用返回的一些数据jsonlite and as tibble以某种方式转换成data frame column This result数据有一个Id整数列和ActionCodedata frame 列有两个内部列 这
  • 闪亮错误:参数暗示行数不同

    我正在尝试开发一个简单的应用程序 从 Kijiji 网站获取本地分类广告 我用几乎相同的脚本制作了一个类似的应用程序 但我没有收到下面描述的错误 所以我不知道这个脚本出了什么问题 我尝试了我能想到的一切 但无法让它发挥作用 的结构df数据框
  • 将命名参数列表传递给函数?

    我想编写一个小函数来从适当的分布生成样本 例如 makeSample lt function n dist params values lt makeSample 100 unif list min 0 max 10 values lt m
  • 如何在R中计算文本中的句子数?

    我使用 R 将文本读入readChar 功能 我的目的是测试文本句子中字母 a 出现次数与字母 b 出现次数一样多的假设 我最近发现了 stringr 包 它帮助我对文本做很多有用的事情 例如计算字符数以及整个文本中每个字母出现的总数 现在
  • 计算例如具有多列 data.frames 的列表中的平均值

    我有几个 data frames 的列表 每个 data frame 有几列 通过使用mean mylist first dataframe a我可以得到这个 data frame 中 a 的平均值 但是我不知道如何计算列表中存储的所有 d
  • 如何用外部图像填充地图边界?

    我正在创建一张带有州边界的巴西地图 这可以直接使用ggplot2 and geom sf 然而 这一次 我不想用数据填充每个状态的颜色 而是想用外部图像 png 填充每个状态的边界 类似于this https online olivet e
  • 在shiny中过滤传单地图数据

    我在用传单地图设置这个闪亮的东西时遇到了麻烦 我的原帖 https stackoverflow com questions 50111566 applying leaflet map bounds to filter data within
  • 在 R 中向散点图添加线条

    如何向图表添加线条 我做了以下 dat lt data frame xvar 1 20 rnorm 20 sd 10 yvar 1 20 rnorm 20 sd 10 zvar 1 20 rnorm 20 sd 10 plot dat 1
  • 纵向序列数据的三次样条方法?

    我有一个串行数据 格式如下 time milk Animal ID 30 25 6 1 31 27 2 1 32 24 4 1 33 17 4 1 34 33 6 1 35 25 4 1 33 29 4 2 34 25 4 2 35 24
  • 如何计算R中移动窗口内的平均斜率

    我的数据集包含2个变量y 和 t 05s y 每 05 秒测量一次 我正在尝试计算移动中的平均坡度20秒窗口 即计算第一个 20 秒斜率值后 窗口向前移动一个时间单位 05 秒 并计算下一个 20 秒窗口 在以下位置生成连续 20 秒斜率值
  • 选择 R 中的数据表中隐藏时(在绿色加号下方)列的显示顺序

    Context 使用 DataTables 库制作交互式表格时 当屏幕宽度对于列的数量和宽度来说太窄时 列将隐藏在绿色 号下 我有一个非常宽的表格 有 20 多列 其中一些内容非常冗长 因此某些列在所有屏幕宽度下总是隐藏的 每次隐藏新列时
  • 通过间接引用列来修改数据框中的某些值

    我正在整理一些数据 我们将失败的数据分类到垃圾箱中 并按批次计算每个分类箱的有限产量 我有一个描述排序箱的元表 这些行按升序测试顺序排列 一些排序标签带有非语法名称 sort tbl lt tibble tribble weight lab

随机推荐

  • 如何通过 Java 使用 Selenium Webdriver 从下拉列表中提取第一个选定选项的文本

    从下拉列表中选择一个选项后 我正在尝试在控制台中显示该选项 下面是我的代码 但我得到 ChromeDriver chrome on WINDOWS d5a01776981da5dacfeb89dbbc2e6b52 gt xpath name
  • std::map 是否自动平衡自身

    我知道STL映射 集的主流实现使用黑红树 我的问题是 这些实现在插入 删除元素时是否也会自动平衡树 如果没有 那么当元素排序和插入时 它总是追加到最右边的位置 最差的查找成本是 O n 那么 黑红树会自动平衡吗 是的 红黑树执行节点旋转以确
  • git fetch origin 不获取所有分支

    我读到的答案这个问题 https stackoverflow com questions 10312521 how to fetch all git branches that git fetch origin应该获取all起源的分支 但就
  • Azure WebApp 未加载我的字体

    我在 Azure 上的 WebApp 遇到了一些问题 我的自定义字体在我的本地主机上正确呈现 但是当我将项目部署到 Azure 并访问网站时 Web 浏览器通知我找不到我的字体 错误 404 但是当我从 Azure 门户访问 FTP 服务器
  • 使用 Python unittest 缓存 setUp() 的结果

    我目前有一个unittest TestCase 看起来像 class test appletrailer unittest TestCase def setup self self all trailers Trailers res 720
  • RandomForestRegressor 和 feature_importances_ 错误

    我正在努力从我的 RandomForestRegressor 中提取特征重要性 我得到 属性错误 GridSearchCV 对象没有属性 功能重要性 有谁知道为什么没有属性吗 根据文档应该存在这个属性 完整代码 from sklearn e
  • 如何释放堆栈上的变量?

    有没有办法释放在堆栈上创建的变量和 或对象 我特意谈论的是堆栈而不是堆 我不想争论这是否有用或良好的做法 我只需要知道它是否可能 我知道当它超出范围时它会自动释放 我想在它超出范围之前取消分配它 我正在使用 C int a a deallo
  • 在 Protractor 中测试模板?

    编写适用于站点中每个页面的断言的最佳方法是什么 我正在测试网站的页脚中是否存在某个元素 因此该元素应该存在于所有页面上 我正在考虑编写一个单独的文件来测试网站的模板元素 然后将其包含在所有规范中 不过似乎没有其他人这样做 首先 为了编写更干
  • Zend Framework:未定义的类常量'MYSQL_ATTR_INIT_COMMAND'

    您可能已经知道 我从之前的问题中从 ubuntu 切换到了 windows 我之前在 ubuntu 上开发 Zend Framework 现在在 Windows 上开发同一个项目 由于这种切换 我在 Windows 中遇到了一些在 ubun
  • EntityTypeConfiguration如何获取关键属性?

    我正在使用 C EF 5 和 MVC4 我正在使用 EntityTypeConfiguration 设置主键和后端表 public class AuditZoneMap EntityTypeConfiguration
  • 为什么 ifstream 文件中的换行符(当通过此代码读取时)占用 2 个字节?

    我使用的文件有 15 行 每行 2 个字符 因此假设文件的大小约为 44 字节 但使用tellg 函数 大小显示为 58 此外 我累积了一个包含所有位置的数组代码正在识别一个换行符 它们都是连续的 因此证实了这个疑问 谢谢你 Tailfil
  • 我不明白为什么我得到 QPainter::begin: Widget Painting can only begin as a result of apaintEvent

    我一直在查看有关此错误的其他 StackOverflow 问题 以及网络上的其他地方 但我不明白这些答案与我的代码有何关系 因此 我希望有一个对我有意义的固定示例 或者更好地解释事件如何以及何时发生 下面的代码旨在计算出其运行的屏幕尺寸 调
  • 为什么这么多网站不允许在密码中使用非字母数字字符?

    在注册时 很多网站不允许在密码中使用符号 从可用性的角度来看 这让我陷入了困境 因为我在所有密码中都包含了多个符号 并且作为一名时不时处理网络身份验证的程序员 我不明白为什么不允许这样做 我错过了什么吗 他们担心 SQL 注入吗 不想处理转
  • 克隆 git 存储库时如何自动保留别名?

    我在 git 存储库的配置文件中设置了一堆方便的别名 我偶尔会克隆这个存储库 例如到我的笔记本电脑上 但克隆不包含我设置的任何别名 大概是因为克隆不会复制存储别名的 git 配置文件 但是 我希望在使用克隆时可以使用这些别名 而无需再次手动
  • 如何下载发送到 Telegram 机器人的文件或照片?

    我正在使用电报机器人 API 但无论如何我都看不到下载发送到我的机器人的文件 我得到了文件的哈希值 但不知道如何处理它 有什么办法吗 谢谢 现在可以使用了 https core telegram org bots api getfile h
  • 警告:将新 ns 映射到旧 ns 并且模拟器突然停止

    升级到 Arctic Fox 后 即使模拟器正在运行但有时会突然停止 我也会收到以下错误 这是什么错误 我怎样才能摆脱这个 我正在使用以下内容复制自cmd gt C Users Debasis gt flutter doctor Docto
  • 如何从xhr下载流媒体视频

    I d like to download a video from a site that uses flowplayer When I inspect the element I get something like So we can
  • Javascript OOP 最佳实践? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • TypeError:调用元类基时出错新样式类不能只有经典基

    类的集合定义为 class A staticmethod def call print a class C type def repr self return somename class B A metaclass C staticmet
  • 基于匹配多个数据集中的多个条件和日期范围添加列

    我一直在努力寻找解决这个问题的最佳方法 为了概括这个问题并帮助其他可能需要执行类似任务的人 我试图找到将列添加到第三个数据集的最佳方法 该方法基于中间数据集中的匹配 并且属于第三数据集的日期范围 最终结果是将第三个数据集中的匹配值返回到第一