【问题标题】:R data.table fast grouping for different columnR data.table 不同列的快速分组
【发布时间】:2013-08-07 14:00:02
【问题描述】:

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

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

【问题讨论】:

    标签: r data.table


    【解决方案1】:

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

    dtData[, Id[which.min(LastTrade)], by=DateTime]
    #    DateTime V1
    # 1:        1  1
    # 2:        2  1
    # 3:        3  2
    # 4:        4  3
    

    【讨论】:

    • 完美。正是我想要的。感谢您的快速答复!
    【解决方案2】:

    我会使用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
    

    【讨论】:

    • 最快的答案是
    猜你喜欢
    • 2012-12-08
    • 1970-01-01
    • 2013-07-03
    • 2018-12-18
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多