2016-07-06 114 views
1

我有以下数据集,我需要跟踪每个用户在一年中每一天的位置顺序。用R表示大数据集中数据帧的子集

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 

然而,当它适用于小型数据框,它需要非常多的时间才能运行在真实的d上ataset(5M行,几乎有100K个人用户)。

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

回答

0

对于较大data.frames,我的经验是,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速度进行了优化。另外,正如你所看到的,它可以让你将流程合并成一行,这非常方便。

+0

谢谢lmo!它完美的工作! – Reflexes