2013-01-09 2 views
0

나는 다음과 같은 열이 포함 된 데이터를 기반으로 요약을 만들려고 해요 : 나는 ITEM_QTY의 요약을 만들려고하고데이터 요약

Trx_Date Brand Cust_Num Item_Qty Item_Price 

및 각 주에 기반 Item_Amt 다른 브랜드 (문자 개체 클래스)에 대한 올해의. 나는에 의해 Wk_Num을 만들 처리했다 :

Wk_Num <- as.character(strftime(as.POSIXlt(Trx_Date), format="%W")) 

는 내가 뭘하려고하면 ITEM_QTY의 합과 각 Wk_Num + 브랜드 조합에 대한 ITEM_PRICE의 평균을 얻는 것입니다. 내가 통해 원하는 것을 얻을 관리 할 다음

tblsum <- summary(Item_Price + Item_Qty ~ Wk_Num + Brand, data=tblorig, FUN = function(x) { c(m = mean(x), s= sum(x))}) 

내가하고 싶은 것은 각각의 특정 Wk_Num + 브랜드에 대한 모든 전체 구매자의 구매자 (즉, 침투)의 비율을 계산하는 다른 열을 만드는 것입니다 콤비네이션. 나뿐만 아니라 길이를 계산하기 위해 위의 코드를 수정할 수 있습니다 즉, (각 조합은 "구매자"의 수를 얻을 수 있습니다)

tblsum <- summary(Item_Price + Item_Qty ~ Wk_Num + Brand, data=tblorig, FUN = function(x) { c(m = mean(x), s= sum(x), l=length(x))}) 

고객이 실제로 내에서 여러 번 구입할 수 있습니다 그러나,이뿐만 아니라, 결함이 일주일에 두 번 계산됩니다.

나는 아직 내 R 여행을 즐기며 우아하게 코드를 작성하려고합니다. 첫 번째 코드에서 작성한 데이터 요약을 결합하고 Cust_Num의 총 수보다 각 Wk_Num + 브랜드 조합에 대한 고유 Cust_Num의 %를 계산하는 좋은 방법이 있습니까?

코드의 개선은 크게 감사 할 것입니다.

업데이트 :

샘플 데이터 :

Wk_Num Brand  Cust_Num Item_Qty Item_Price 
11  AAA   001   1   2.1 
11  BBB   001   1   1.4 
11  AAA   002   2   2.1 
12  CCC   003   1   1.5 
12  BBB   001   3   1.4 
12  BBB   001   2   1.4 
12  BBB   004   1   1.5 
12  CCC   004   1   1.5 
13  AAA   002   2   2.2 
13  AAA   001   3   2.1 
13  AAA   003   1   2.2 
13  AAA   004   2   2.1 

출력이기 때문에 이상적 일 것이다 무엇 :

Wk_Num Brand  Total Item Avg Item Price Penetration 
11  AAA    3  2.10    50%   # 2 out of 4 
11  BBB    1  1.40    25%   # 1 out of 4 
12  BBB    6  1.43    50%   # 2 out of 4 (Cust 001 bought twice in that week) 
12  CCC    1  1.50    25%   # 1 out of 4 
13  AAA    8  2.15    100%   # 4 out of 4 

답변

4

당신은 plyr 패키지에서 ddply 기능을 사용할 수 있습니다 :

(데이터 프레임을 가정 dat이라고합니다.)

library(plyr) 
ddply(dat, .(Wk_Num, Brand), summarise, 
     Total_Item = sum(Item_Qty), 
     Avg_Item_Price = mean(Item_Price), 
     Penetration = length(unique(Cust_Num))/length(unique(dat$Cust_Num))) 

결과 :

Wk_Num Brand Total_Item Avg_Item_Price Penetration 
1  11 AAA   3  2.100000  0.50 
2  11 BBB   1  1.400000  0.25 
3  12 BBB   6  1.433333  0.50 
4  12 CCC   2  1.500000  0.50 
5  13 AAA   8  2.150000  1.00 
+0

! 비엘 덩크, 스벤! – jacatra

3

data.table 사용 : 정말 잘 작동

require(data.table) 
x.dt <- data.table(dat) 
yy <- x.dt[, list(Total_Item = sum(Item_Qty), Avg_Item_Price = mean(Item_Price), 
      Penetration = length(unique(Cust_Num))/length(unique(x.dt$Cust_Num))), 
      by="Wk_Num,Brand"] 
+1

+1'unique '가 상대적으로 비싸기 때문에 각 그룹마다 매번 같은 번호를 계산하기보다는'unique (x.dt $ Cust_Num)'의 결과를 먼저 저장할 수있었습니다. –