2

也许有人可以为我指出正确的方向。我似乎无法为这个问题找到一个简单的解决方案

我有一个 data.table 在这里给出。

library(data.table)
dtData <- data.table(DateTime = c(1,2,1,2,3, 1,2,3,4), 
                     Id = c(1,1,2,2,2,3,3,3,3), 
                     LastTrade = as.Date(c('2013-01-01', '2013-01-01', '2013-06-01', 
                                           '2013-06-01', '2013-06-01', '2013-09-01',
                                           '2013-09-01', '2013-09-01', '2013-09-01')))

我想对数据进行快速分组。所以我可以很容易地做到:

dtData[, min(LastTrade), by=DateTime]

这给了我

    DateTime        V1
1:        1 2013-01-01
2:        2 2013-01-01
3:        3 2013-06-01
4:        4 2013-09-01

现在我的问题是:我怎样才能得到“Id”列作为结果,而不是将最小的 LastTrade 列作为“V1”取回?

    DateTime    V1
1:        1      1
2:        2      1
3:        3      2
4:        4      3
4

2 回答 2

3

您可以使用which.min来标识包含最小值的行,并使用它来对Id列进行子集化。

dtData[, Id[which.min(LastTrade)], by=DateTime]
#    DateTime V1
# 1:        1  1
# 2:        2  1
# 3:        3  2
# 4:        4  3
于 2013-08-07T14:07:41.553 回答
3

我会利用“关键”功能,data.table然后使用mult="first"选项。这将消除对每个组进行“最小”调用的必要性,并且应该更快。

# sort by DateTime and LastTrade once
setkey(dtData, DateTime, LastTrade)
dtData[J(unique(DateTime)), mult="first"]
   DateTime Id  LastTrade
1:        1  1 2013-01-01
2:        2  1 2013-01-01
3:        3  2 2013-06-01
4:        4  3 2013-09-01
于 2013-08-07T14:29:19.123 回答