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

时间:2014-04-01 12:49:54

标签: r merge data.table conditional-statements duplicate-removal

我合并了两个数据集。集合X包含ID和startDate,设置Y为ID和endDate。两者都有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”,我想只保留具有最低endDate的重复条目。对于“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是彼此的重复,具有不同的endDate。只有条目1必须保留(因为它具有与startDate最接近的endDate)。 3和4也是彼此的重复,具有不同的startDate。这里,条目4必须保持(因为它具有关闭startDate到endDate)。所以所需的输出是

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

我不知道如何使用duplicated(DT)来实现这一点,因为它不一定能提供我想要的特定副本。有人有建议吗?而且,我可以在“加入”期间解决这个问题而不是之后解决它吗?

1 个答案:

答案 0 :(得分:2)

我不认为这可以在单个联接中完成,但可能以下内容可以起作用:

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