2016-07-06 4 views
1

다음 데이터 세트가 있고 각 사용자가 일년 중 어디에 속해 있던지 순서를 추적해야합니다. 반면,큰 데이터 세트의 경우 R의 데이터 프레임 하위 집합

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 

그러나 다음 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 
    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 

나는 다음과 같은 스레드에서 사용되는 스크립트를 수정 그것은 작은 데이터 프레임을 위해 작동합니다. 실제 d에서 실행하는 데 과도한 시간이 걸립니다. ataset (거의 100,000 명의 개별 사용자가있는 5 백만 개의 행).

더 효율적인 방법이 있습니까?

답변

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

관련 문제