2013-10-22 3 views
4

얼마 전 시장 바구니 데이터 생성에 관한 질문을했습니다. 이제 비슷한 data.frame을 만들지 만 세 번째 변수를 기반으로합니다. 불행히도 나는 문제를 겪고있다. 이전 질문 : Effecient way to create market basket matrix in R
@ shadow 및 @ SimonO101은 나에게 좋은 답변을 주었지만, 나는 정확하게 answser를 변경할 수 없었다.세 번째 변수 (숫자)를 기반으로하는 비상 계획 테이블

Customer <- as.factor(c(1000001,1000001,1000001,1000001,1000001,1000001,1000002,1000002,1000002,1000003,1000003,1000003)) 
Product <- as.factor(c(100001,100001,100001,100004,100004,100002,100003,100003,100003,100002,100003,100008)) 
input <- data.frame(Customer,Product) 

내가 지금 다음과 같은 방법을 비상 테이블을 만들 수 있습니다 :

input_df <- as.data.frame.matrix(table(input)) 

그러나 나는 테이블의 출력으로 원하는 제 (숫자) 변수가 나는 다음과 같은 데이터가 있습니다.
Number <- c(3,1,-4,1,1,1,1,1,1,1,1,1) 
input <- data.frame(Customer,Product,Number) 

이제 코드는 (물론, 지금은 3 개 변수가) 더 이상 작동하지 않습니다. 내가 찾고있는 결과는 고유 한 고객이 행 이름과 고유 한 제품을 열 이름으로 사용합니다. 값 (또는 존재하지 않는 경우는 0이),이 숫자에 의해 계산 될 수 있기 때문에 그리고 수 있습니다 뭔가 명확하지 않은 경우
input_agg <- aggregate(Number ~ Customer + Product, data = input, sum) 

내 질문은 분명하다 희망, 의견을주십시오.

+0

한 또 다른 재현 예를 들어. –

+0

'aggregate' 단계를 성공적으로 완료 할 수 있습니까? – A5C1D2H2I1M1N2O1R2T1

답변

6

당신은 그것에 대해 xtabs를 사용할 수 있습니다

R> xtabs(Number~Customer+Product, data=input) 

     Product 
Customer 100001 100002 100003 100004 100008 
    1000001  0  1  0  2  0 
    1000002  0  0  3  0  0 
    1000003  0  1  1  0  1 
+0

+1 항상 xtabs를 잊어 버립니다. 좋은 대답은 –

+0

@ SimonO101 사실, 방금 발견했습니다 :-) – juba

+0

효율성 문제는 아니지만 시스템에 얼마나 많은 RAM이 있는지 생각합니다. 어떤 방법을 사용하든 계산할 때마다 메모리에 저장할 90000x2000 테이블로 끝납니다. – juba

4

문제의 클래스 reshape2::dcast 위해 설계 ... 최근 data.tabledcast 객체를 사용하기위한 방법 FR #2627 @Arun에 응답하여 구현


require(reshape2) 
# Too many rows so change to a data.table. 
dcast(input , Customer ~ Product , fun = sum , value.var = "Number") 
# Customer 100001 100002 100003 100004 100008 
#1 1000001  0  1  0  2  0 
#2 1000002  0  0  3  0  0 
#3 1000003  0  1  1  0  1 

. 좋은 물건. 개발 버전 1.8.11을 사용해야합니다. 또한 현재로서는 dcast.data.table으로 사용해야합니다. dcast은 아직 reshape2 패키지에 S3 일반이 아니기 때문입니다.

require(reshape2) 
require(data.table) 
input <- data.table(input) 
dcast.data.table(input , Customer ~ Product , fun = sum , value.var = "Number") 
# Customer 100001 100002 100003 100004 100008 
# 1: 1000001  0  1  0  2  0 
# 2: 1000002  0  0  3  0  0 
# 3: 1000003  0  1  1  0  1 

이 큰 데이터를 아주 잘 작동합니다뿐만 아니라 reshape2:::dcast보다 훨씬 더 빨리해야한다 : 즉, 당신은 할 수있다.


다른 방법으로, 수도 있고 충돌하지 않을 수 reshape:::cast 버전을 시도 할 수 있습니다 ... 그것을 시도!

require(reshape) 
input <- data.table(input) 
cast(input , Customer ~ Product , fun = sum , value = .(Number)) 
+0

빠른 응답, 이것은 실제로 작동합니다. 그러나 그것은 내 R 세션을 현장에서 충돌시킵니다. 내 질문을 업데이트했습니다. – Freddy

+0

@Freddy 업데이트를 참조하십시오. 'data.table'을 사용하십시오. 이들을 위해 dcast 메소드가 작성되었습니다. 빨리해야하며 컴퓨터가 충돌하는 것을 피하십시오! –

+0

@Freddy, 그러나'data.frame'보다는'data.table'을 가지고 있습니까? 그것은 중요한 차이입니다! 또한 출력에 변수를 지정하지 않으면 콘솔로 인쇄하려고 시도 할 것이므로 충돌이 발생할 수 있으므로 복사하여 붙여 넣으십시오. 'input <- data.table (input); 출력 <- dcast (input, Customer ~ Product, fun = sum, value.var = "Number")' –

관련 문제