2016-07-06 16 views
1

私は以下のデータセットを持っており、各ユーザーが毎年どこにいたかを追跡する必要があります。変更されたコードは、以下であるRanking subsets of a data frame in R大規模なデータセットの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 

、一方

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 

Iは次のスレッドで使用されるスクリプトを改変しましたそれは小さなデータフレームのために働く、それは実際のdで実行するのに過度の時間がかかるataset(約100,000人のユーザがいる5M行)。

これを行うより効率的な方法はありますか?

答えて

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と速度のために最適化されています。また、あなたが見ることができるように、プロセスを1つの行にまとめることができます。これはかなり便利です。

+0

ありがとうございました!それは完全に動作します! – Reflexes

関連する問題