2012-11-16 6 views
4

의 레코드 블록에 대한 시퀀스 번호를 생성 나는 (내 기준으로) 상당히 큰 데이터 집합을 가지고 있고 레코드의 블록 시퀀스 번호를 만들려고합니다. plyr 패키지를 사용할 수는 있지만 실행 시간이 매우 느립니다. 아래 코드는 비슷한 크기의 데이터 프레임을 복제합니다.는 R 데이터 프레임

## simulate an example of the size of a normal data frame 
N <- 30000 
id <- sample(1:17000, N, replace=T) 
term <- as.character(sample(c(9:12), N, replace=T)) 
date <- sample(seq(as.Date("2012-08-01"), Sys.Date(), by="day"), N, replace=T) 
char <- data.frame(matrix(sample(LETTERS, N*50, replace=T), N, 50)) 
val <- data.frame(matrix(rnorm(N*50), N, 50)) 
df <- data.frame(id, term, date, char, val, stringsAsFactors=F) 
dim(df) 

실제로이 값은 일반적으로 값이 크기 때문에 작업하는 것보다 약간 작지만이 정도면 충분합니다.

> system.time(test.plyr <- ddply(df, 
+        .(id, term), 
+        summarise, 
+        seqnum = 1:length(id), 
+        .progress="text")) 
    |===============================================================================================| 100% 
    user system elapsed 
    63.52 0.03 63.85 

이 할 수있는 "더 나은"방법이 있나요 : 여기

내 컴퓨터에서 실행 시간인가? 불행히도, 나는 Windows 컴퓨터를 사용하고 있습니다.

미리 감사드립니다.

편집 : Data.table가 매우 빠르고,하지만 난 내 일련 번호가 제대로 CALC 얻을 수 없습니다. 여기 내 ddply 버전이 만든 것입니다. 대부분은 그룹에서 하나 개의 기록을 가지고 있지만, 일부 등 2 행, 3 행,

> with(test.plyr, table(seqnum)) 
seqnum 
    1  2  3  4  5 
24272 4950 681 88  9 

그리고 아래 그림과 같이 data.table 사용하여 동일한 접근 수율이 있습니다

> with(test.dt, table(V1)) 
V1 
    1 
24272 

답변

5

사용 data.table

dt = data.table(df) 
test.dt = dt[,.N,"id,term"] 

다음은 타이밍 비교입니다. 또한 dplyr에 해들리의 최신 작품을 체크 아웃 170

test replications elapsed relative 
2 f_dt()   10 0.779 1.000 
1 f_plyr()   10 132.572 170.182 

f_plyr <- function(){ 
    test.plyr <- ddply(df, .(id, term), summarise, seqnum = 1:length(id), 
.progress="text") 
} 

f_dt <- function(){ 
dt = data.table(df) 
test.dt = dt[,.N,"id,term"] 
} 

library(rbenchmark) 
benchmark(f_plyr(), f_dt(), replications = 10, 
    columns = c("test", "replications", "elapsed", "relative")) 

data.table 일을 속도를 데이터 세트를 생성하는 동안 나는 3000 N을 = 사용 1700과 17000을 대체했다. 매트의 의견에 따라 .N-length(id)을 변경, 편집 코드 : dplyr가 많은 코드가 C로

UPDATE 재되고 있음을 주어, 추가로 속도 향상을 제공하는 경우 나는 놀라지 않을 것이다.

+0

감사합니다. 해들리가 그 일을하고 있다는 것을 알고 있지만, 잠시 동안 나는 고침이 필요합니다. 속도 향상은 미친 짓이다. 내 컴퓨터에서 실행할 때 (test.df, table (V1)), 내가 볼 수있는 것은 시퀀스 번호 1입니다. 우리는 데이터를 시뮬레이트하고 있지만 일부 레코드에는 그룹화 내에서 둘 이상의 레코드가 있어야합니다. – Btibert3

+0

문제는 data.table이 열을 다르게 정렬하는 것입니다. 당신은'머리 (plyr :: 정렬 (test.dt, ID를))'를 사용하는 경우, 당신은 출력이 도움을'test.plyr' – Ramnath

+0

감사와 동일한 것을 볼 수 있습니다. 내 마지막에 가장 가능성이 큰 사용자 오류,하지만 상관없이, 내가 data.table 솔루션을 사용할 때 V1의 값은 1뿐입니다. 위 참조. – Btibert3