我有两个数据帧,一个包含日期列表(df1),另一个包含ID的日期范围(df2).如果df1中的日期位于df2中的日期范围内,我想在df2中添加一列.

## This is my base data
df1 <- 
structure(list(Date = structure(c(18848, 18848, 18849, 18890, 
18892, 18901, 18904, 18904, 18906, 18906, 18907, 18911, 18911, 
18922, 18923, 18925, 18926, 18927, 18929), class = "Date"), Id = c(4, 
6, 4, 6, 4, 4, 4, 6, 4, 6, 4, 4, 6, 4, 4, 4, 4, 6, 6)), row.names = c(NA, 
19L), class = "data.frame")

## This is my date range table
df2 <- structure(list(Date.Start = structure(c(18898, 18897, 18848, 
18898, 18897), class = "Date"), Date.End = structure(c(18924, 
18924, 18903, 18924, 18924), class = "Date"), Id = c(6, 6, 4, 
4, 4), Return.Value = c(1, 2, 3, 4, 5)), row.names = c(NA, 5L
), class = "data.frame")

enter image description here

因此,对于第一行df1,Date=‘2021-08-09’位于日期范围‘2021-08-09’到‘2021-10-03’(第3行,共df2行)内,因此我想将Return Value列添加到df1,值为3.

我的预期输出是:

enter image description here

我try 了这个链接Check if a date is in range of lookup table,但我想从df2中添加一列,而不是返回逻辑向量.

推荐答案

data.table版本在非等联接上使用mult="first"选项,允许>=<=比较:

library(data.table)
setDT(df1)
setDT(df2)
df1[, Return.Value := df2[
    df1, on=c("Id", "Date.Start<=Date", "Date.End>=Date"), Return.Value, mult="first"]]
df1
#          Date Id Return.Value
# 1: 2021-08-09  4            3
# 2: 2021-08-09  6           NA
# 3: 2021-08-10  4            3
# 4: 2021-09-20  6           NA
# 5: 2021-09-22  4            3
# 6: 2021-10-01  4            3
# 7: 2021-10-04  4            4
# 8: 2021-10-04  6            1
# 9: 2021-10-06  4            4
#10: 2021-10-06  6            1
#11: 2021-10-07  4            4
#12: 2021-10-11  4            4
#13: 2021-10-11  6            1
#14: 2021-10-22  4            4
#15: 2021-10-23  4            4
#16: 2021-10-25  4           NA
#17: 2021-10-26  4           NA
#18: 2021-10-27  6           NA
#19: 2021-10-29  6           NA

R相关问答推荐

R dðr按时间间隔进行总结

用R从API中提取数据

返回句子中最长的偶数长单词

将虚线添加到每个站点的传奇中平均

插入指示行之间时间间隔的新行

使用Shiny组合和显示复制和粘贴的数据

在特定列上滞后n行,同时扩展框架的长度

在R中替换函数中的特定符号

如何改变x轴比例的列在面

多个模拟序列间的一种预测回归关系

以更少间隔的较小表中的聚合离散频率表

仅 Select 超过9行的CSV文件

如何在R中通过多个变量创建交叉表?

有没有一种方法可以同时对rhandsontable进行排序和从rhandsontable中删除?

仅在R中的数据集开始和结束时删除所有 Select 列的具有NA的行

如果COLSUM为>;0,则COLNAME为向量

创建列并对大型数据集中的特定条件进行成对比较的更高效程序

将工作目录子文件夹中的文件批量重命名为顺序

避免在图例中显示VLINS组

在r中整理图例和堆叠图的问题