【发布时间】:2014-05-12 06:12:15
【问题描述】:
我已经合并了两个数据集。集合 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 必须保留(因为它的 endDate 与 startDate 最接近)。 3 和 4 也是彼此的副本,具有不同的 startDate。在这里,条目 4 必须保留(因为它具有关闭 startDate 到 endDate)。所以需要的输出是
IDX startDate endDate
1: 1 1 2
2: 2 3 4
我不知道如何使用duplicated(DT) 来实现这一点,因为它不一定给出我想要的特定副本。有人有建议吗?此外,我是否可以在“加入”期间解决这个问题,而不是事后解决?
【问题讨论】:
-
我不确定我是否正确理解了您的问题:
data.table( IDX = c(1,1,1), startDate = c(2,2,1), endDate = c(1,2,2) )的正确结果是什么? -
@Arun 这是涵盖我想要的所有情况的最简单示例。我更新了输出。
标签: r merge data.table conditional-statements duplicate-removal