我合并了两个数据集。集合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)
来实现这一点,因为它不一定能提供我想要的特定副本。有人有建议吗?而且,我可以在“加入”期间解决这个问题而不是之后解决它吗?
答案 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