【发布时间】:2019-09-16 20:29:18
【问题描述】:
我有一个 data.table,我正在尝试对其进行子集化,以便通过 ID 和 LAB_DT 获得最低的 TEST_RESULT:
DT <- data.table::data.table(ID=c("1","1","1","2","2","3","3","3"),
LAB_DT=lubridate::as_date(c("1992-11-01",
"1992-11-01",
"1992-11-02",
"1992-11-04",
"1992-11-04",
"1992-11-06",
"1992-11-06",
"1992-11-08")),
TEST_RESULT=c(5.4,5.8,5.2,5.6,6,6,7,8))
setkeyv(DT,c("ID","LAB_DT","TEST_RESULT"))
ID LAB_DT TEST_RESULT
1: 1 1992-11-01 5.4
2: 1 1992-11-01 5.8
3: 1 1992-11-02 5.2
4: 2 1992-11-04 5.6
5: 2 1992-11-04 6.0
6: 3 1992-11-06 6.0
7: 3 1992-11-06 7.0
8: 3 1992-11-08 8.0
我已经通过自己的方法成功做到了:
DT[,FIRST.LAB_DT:=0]
DT[, FIRST.LAB_DT := c(1L, FIRST.LAB_DT[-1]), by = .(ID,LAB_DT)]
ID LAB_DT TEST_RESULT FIRST.LAB_DT
1: 1 1992-11-01 5.4 1
2: 1 1992-11-01 5.8 0
3: 1 1992-11-02 5.2 1
4: 2 1992-11-04 5.6 1
5: 2 1992-11-04 6.0 0
6: 3 1992-11-06 6.0 1
7: 3 1992-11-06 7.0 0
8: 3 1992-11-08 8.0 1
DT[FIRST.LAB_DT==1,]
ID LAB_DT TEST_RESULT FIRST.LAB_DT
1: 1 1992-11-01 5.4 1
2: 1 1992-11-02 5.2 1
3: 2 1992-11-04 5.6 1
4: 3 1992-11-06 6.0 1
5: 3 1992-11-08 8.0 1
但是,我正在使用的实际 data.table 有 ~8e6 行和I recently found,您可以使用键以更快的方式对 data.table 进行子集化。
有人知道如何使用键产生相同的最终输出吗?
【问题讨论】:
-
与key无关,但我认为这将是获得结果的最快方法:
DT[DT[, .I[which.min(TEST_RESULT)], .(ID, LAB_DT)]$V1] -
@IceCreamToucan 我排在第二位,是最快的。我认为 hadley 提出了这个问题,询问
data.table中子集的性能,并且对该线程进行了很好的讨论/回答。我看看能不能找到。 p.s.已经找到了。
标签: r data.table key subset