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

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(使用前将#替换为@)

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

  • ess-rdired:我收到此错误“现在没有 ESS 进程与此缓冲区关联”

    To use ess rdired为了浏览对象 我按照 ESS 手册并将以下内容添加到我的 emacs autoload ess rdired ess rdired View R objects in a dired like buffer
  • 无效的命令名称“tk_chooseDirectory”错误

    我使用 bioconductor 进行 WES 管道 并使用 tk choose dir 选择用户存储输入文件的目录 并将其存储以供进一步使用 这里是命令行 library tcltk dataDir lt dirname tk choos
  • tidyverse 干扰 ggplot2 吗?无法访问map_data

    在控制台中运行这些命令 输出为 gt cty0 ggplot2 map data county gt library tidyverse Loading tidyverse ggplot2 Loading tidyverse tibble
  • r:按多列分组并计数

    我有以下数据框 df LeftOrRight SpeedCategory NumThruLanes R 25to45 3 L 45to62 2 R Gt62 1 我想按速度类别对其进行分组 并循环遍历其他列以获取每个速度类别中每个唯一代码的
  • dplyr:带引号变量名的 mutate 的标准评估

    我将如何使用mutate 我的假设是我正在寻找标准评价就我而言 因此mutate 但我对此并不完全有信心 当使用接受变量名列表的函数时 如下所示 createSum function data variableNames data gt m
  • 距数据帧中最近的非 NA 值的距离

    我有以下数据帧 df 我想添加一列 其中包含与每行最接近的非 NA 值的距离 df lt data frame x 1 20 df c 1 3 4 5 11 14 15 16 x lt NA 换句话说 我正在寻找以下值 df distanc
  • R中无法连接odbc数据库

    我一直在尝试使用以下命令将我公司的 DMS 连接到 RodbcConnect命令 但收到以下消息 myConn lt odbcConnect NZSQL uid cejacobson pwd password Warning message
  • 在 R 中安全地计算算术表达式?

    Edit 好吧 由于似乎有很多混乱 我将稍微简化一下问题 您可以尝试回答下面的原始问题 或者您可以解决此版本并忽略该行下面的所有内容 我的目标是采用任意表达式并在极其受限的环境中对其进行评估 该环境将仅包含具有以下类型值的变量 数值向量 接
  • ggsubplot 是否适用于 R 3.2.1+?

    CRAN 提供的 ggsubplot 版本与 R 的最新版本 例如 3 1 1 不兼容 运行 ggsubplot 示例会返回以下错误 Error in layout base data vars drop drop At least one
  • data.table 的包装函数

    我有一个已经使用 data frame 上下文编写的项目 为了缩短计算时间 我尝试利用 data table 的速度 我的方法是构造包装函数 读取帧 将它们转换为表 进行计算 然后转换回帧 这是一个简单的例子 FastAgg lt func
  • 如何在 R Markdown 中的内联 LateX 方程中输出 R 变量的值(即动态更新)

    我无法找到一种方法将 r 代码实现到 R markdown 中的内联 LateX 方程中 目标是如果变量 值 发生变化 则不必对它们的值进行硬编码 Given values lt c 1 4 2 5 7 9 avg lt sum value
  • R中使用余弦距离的层次聚类

    我想通过使用余弦相似度与 R 编程语言对文档语料库进行层次聚类 但出现以下错误 if is na n n gt 65536L stop 大小不能为 NA 或 超过 65536 需要 TRUE FALSE 时缺少值 我应该怎么办 为了重现它
  • R:(中缀)运算符的两个定义之间的冲突:如何指定包?

    在 R 中 每当两个包定义相同的函数时 很容易指定要使用哪个包pkg foo 但是 当冲突的功能是一个时 你该怎么办 infix运算符 即使用定义 举个例子 两者ggplot2 and crayon define 有没有一种方法可以让我默认
  • 在ggplot2中,箱线图线的末尾代表什么?

    我找不到箱线图线条端点代表什么的描述 For example here are point values above and below where the lines end 我意识到盒子的顶部和底部是第 25 个和第 75 个百分位数
  • 使用 R Markdown 文档作为函数源

    我正在研究 R Markdown 来记录我经常使用的功能 我会将它们放入 R Markdown 文件中以记录它们 然后如果我几个月后回来查看它 就能够阅读我在函数背后的想法 我的问题是 如果我开始一个新的 R 项目 是否可以获取 r mar
  • R 无法回忆起内存中的对象

    我正在构建一个包含多个步骤的函数 其中每个步骤都会创建一个对象 某个步骤失败 temp3 并且无法找到前面的步骤对象 错误 未找到对象 temp2 我不知道为什么 我有类似的函数 遵循完全相同的结构 每个步骤都遵循先前创建的对象 在函数内
  • R ggplot2 分面保持比率但覆盖/定义输出图大小

    我目前正在使用 ggplot2 来比较不同组的统计数据 每个组属于不同的区域 这是通过运行 R 脚本的 Web 应用程序 tikiwiki CMS 插件 R 完成的 每个区域我可以有 2 到 30 个或更多组 相同的 R 脚本针对唯一网页中
  • 按名称包含在单个对象中的多个列对 data.frame 进行排序?

    我想排序一个data frame由多列组成 理想情况下使用基础 R 无需任何外部包 尽管如果有必要 就这样吧 读过如何按列对数据框进行排序 https stackoverflow com questions 1296646 how to s
  • R中data.frame(列表)的列平均值

    Data https i stack imgur com ZYsmv jpg 请 我需要计算此 data frame 中维吉尼亚币 Sepal Length 列的平均值 Sepal Length Sepal Width Petal Leng
  • 从 leafletProxy() 返回渲染的传单地图

    是否可以在渲染后在 Shiny 中检索传单地图 下面是一个代码示例 展示了如何生成地图leaflet 与返回的不同leafletProxy 即使它们在渲染时看起来完全相同 是否有一个功能可能不同于leafletProxy 获取实际的 htm

随机推荐

  • 如何通过 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
  • 基于匹配多个数据集中的多个条件和日期范围添加列

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