R data.table快速分组为不同的列

时间:2013-08-07 14:00:02

标签: r data.table

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

我有一个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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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