2017-10-04 1 views
0

arules 패키지의 apriori 함수에서 사용하기 위해 data.frame에서 트랜잭션 클래스로 변환하려고하는 1 백만 개의 트랜잭션 행이있는 데이터 세트가 있습니다. 설명서에 나와있는 양식을 사용하고 있습니다.R arules - 빠른 트랜잭션 생성 방법

a_df3 <- data.frame(
TID = c(1,1,2,2,2,3), 
item=c("a","b","a","b","c", "b") 
) 
a_df3 
trans4 <- as(split(a_df3[,"item"], a_df3[,"TID"]), "transactions") 

그러나 대용량 데이터의 경우 매우 느립니다. 이 속도를 높이는 방법이 있습니까?

답변

0

목록 split의 결과를 Matrix에서 희소 한 ngCMatrix으로 변환하는 것은 비용이 많이 든다. 대부분의 경우 이것은 제공된 트랜잭션에 중복 항목이없고 트랜잭션의 항목이 정렬되어 있는지 확인할 수 없기 때문입니다. ...

첫 번째 data.frame을 트랜잭션으로 직접 변환하는 실험 코드는

입니다.
library("arules") 
library("Matrix") 

a_df <- data.frame(
    TID = c(1,1,2,2,2,3), 
    item=c("a","b","a","b","c", "b") 
) 

j <- as.integer(a_df$TID) 
item <- factor(a_df$item) 
i <- as.integer(item) 

ngT <- new("ngTMatrix", i = i-1L, j = j-1L, Dim = c(max(i), max(j)), 
    Dimnames = list(levels(item), NULL)) 
ngC <- as(ngT, "ngCMatrix") 
trans <- as(ngC, "transactions") 

inspect(trans) 

    items itemsetID 
[1] {a,b} 1   
[2] {a,b,c} 2   
[3] {b}  3 

분당 100 만회의 트랜잭션이 소요됩니다. 코드가 arules 패키지로 전달 될 때까지주의해서 (입력 데이터를 확인하지 않음) 코드를 사용하십시오.