对大型数据集的 R 中数据框的子集进行排名
Ranking subsets of a data frame in R for large datasets
我有以下数据集,我需要跟踪每个用户在一年中的每一天所在的位置顺序。
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 万个人用户)上 运行 需要花费过多的时间。
有没有更有效的方法?
对于更大的 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 的速度进行了优化。此外,如您所见,它允许您将流程合并为一行,这非常方便。
我有以下数据集,我需要跟踪每个用户在一年中的每一天所在的位置顺序。
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 万个人用户)上 运行 需要花费过多的时间。
有没有更有效的方法?
对于更大的 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 的速度进行了优化。此外,如您所见,它允许您将流程合并为一行,这非常方便。