【问题标题】:Ranking subsets of a data frame in R for large datasets为大型数据集在 R 中对数据框的子集进行排名
【发布时间】:2016-07-06 17:25:38
【问题描述】:

我有以下数据集,我需要跟踪一年中每一天每个用户所在位置的顺序。

   User    Date        Location     Time
    90   2013-01-28       39      16:06:20
    26   2013-02-04       27      19:32:09
    23   2013-02-04        5      16:03:39
    23   2013-01-07       29      15:40:25
    84   2013-02-27       50      17:25:40
    57   2013-01-30        5      17:26:26

我修改了以下线程中使用的脚本:Ranking subsets of a data frame in R

修改后的代码如下:

data$User <- as.factor(data$User)
data$Date <- as.factor(data$Date)

data$Sequence <- ave(data$Time, data$User, data$Date, FUN=rank) 

data <- data[order(data$Sequence),]
data <- data[order(data$User),]
data <- data[order(data$Date),]

结果:

   User    Date        Location     Time   Sequence
    3    2013-01-01       29      18:47:31    1
    4    2013-01-01       18      07:00:21    1
    4    2013-01-01       37      07:16:19    2
    4    2013-01-01       11      08:28:37    3
    6    2013-01-01        6      07:17:05    1
    6    2013-01-01       34      08:10:38    2

但是,虽然它适用于小型数据帧,但在真实数据集(500 万行和近 10 万个个人用户)上运行需要大量时间。

有没有更有效的方法来做到这一点?

【问题讨论】:

    标签: r sorting dataframe sequence ranking


    【解决方案1】:

    对于较大的 data.frame,我的经验是 ave 可能会变得很慢。

    您最大的提速可能是切换到data.table

    # load data.table package
    library(data.table)
    # convert data.frame into data.table
    setDT(data)
    
    # get ranks and sort
    data[, Sequence := rank(Time), by=.(User, Date)][order(Sequence, User, Date),]
    

    此软件包针对大型 data.frames 的速度进行了优化。此外,如您所见,它允许您将流程合并到一行中,这非常方便。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-04
      • 2019-09-26
      • 1970-01-01
      • 2020-10-17
      • 2017-07-29
      • 2011-08-13
      • 2016-09-28
      • 2021-09-16
      相关资源
      最近更新 更多