R 有条件地从data.table中删除重复的元素

R 有条件地从data.table中删除重复的元素,r,merge,data.table,conditional-statements,duplicate-removal,R,Merge,Data.table,Conditional Statements,Duplicate Removal,我合并了两个数据集。集合X包含ID和开始日期,集合Y包含ID和结束日期。两者都以ID作为密钥。我希望将每个startDate与其对应的endDate匹配(前提是它大于startDate)。问题是ID可能在给定的集合中出现多次,但在同一集合中出现的次数并不总是相同。因此,startDate可以与endDate的多个条目匹配,反之亦然。这基本上就是我的代码: require(data.table) startDate = c(1,2,3,1) IDX = c(1,2,2,3) endDate =

我合并了两个数据集。集合X包含ID和开始日期,集合Y包含ID和结束日期。两者都以ID作为密钥。我希望将每个startDate与其对应的endDate匹配(前提是它大于startDate)。问题是ID可能在给定的集合中出现多次,但在同一集合中出现的次数并不总是相同。因此,startDate可以与endDate的多个条目匹配,反之亦然。这基本上就是我的代码:

require(data.table)

startDate = c(1,2,3,1)
IDX = c(1,2,2,3)
endDate = c(2,3,4)
IDY = c(1,1,2)

X = data.table(startDate,IDX)
Y= data.table(endDate,IDY)

setkey(X,IDX)
setkey(Y,IDY)
DT = X[Y,allow.cartesian = TRUE][endDate>startDate]   
现在我想有条件地从集合DT中删除重复的条目。对应于键“ID”和“startDate”,我只想保留具有最低结束日期的重复条目。对于“ID”和“endDate”的每个重复条目,我都希望执行相同的操作,但保留具有最高startDate的条目

DT如下所示:

   IDX startDate endDate
1:   1         1       2
2:   1         1       3
3:   2         2       4
4:   2         3       4
此新数据表中有两个重复项。1和2是彼此的副本,具有不同的结束日期。只有条目1必须保留(因为它的结束日期与开始日期最接近)。3和4也是彼此的副本,起始日期不同。在这里,条目4必须保留(因为它的起始日期是closes startDate到endDate)。因此,所需的输出是

   IDX startDate endDate
1:   1         1       2
2:   2         3       4

我不知道如何使用
duplicated(DT)
实现这一点,因为它不一定会给出我想要的特定副本。有人有什么建议吗?此外,我是否可以在“加入”过程中解决此问题,而不是事后解决

我不认为这可以在一个连接中完成,但也许以下方法可以奏效:

Y[, startDate := endDate]
setkey(X, IDX, startDate)
setkey(Y, IDY, startDate)

Y[X, roll = -Inf][, list(startDate = startDate[.N]), by = list(IDY, endDate)]
#   IDY endDate startDate
#1:   1       2         1
#2:   2       4         3

我不确定我是否正确理解了你的问题:
data.table(IDX=c(1,1,1),startDate=c(2,2,1),endDate=c(1,2,2))
?@Arun这是涵盖我想要的所有情况的最简单的例子。我更新了输出。我现在显示了预期的输出,这样问题就更清楚了(我希望如此)。在实践中,X和Y的尺寸并不相等,顺便说一句。@Forzaa好的,看看编辑的版本是否是你想要的+1超赞的
滚动使用。您可能需要添加
nomatch=0L
,以确保在没有特定ID的
endDate>startDate
时,不会出现
NA
结果。@Arun谢谢,这是一个很好的观点-OP可以决定他们喜欢在这方面做什么situation@eddi,是的,这一点或多或少是针对OP:)的。回答得很好,再一次!我认为它也相当于
Y[X[J(unique(IDX)),mult=“last”],roll=-Inf]
(或者从1.9.3+也相当于
Y[unique(X,by=“IDX”,fromLast=TRUE),roll=-Inf]