也许有人可以指出我正确的方向。我似乎找不到解决这个问题的简单方法
我有一个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
答案 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