2015-02-02 5 views
1

다소 복잡한 문제가 있습니다. 나는 다른 회사와 다른 구매자가 있습니다. 또한 나는 15 가지 제품까지 갈 수있는 다른 제품들도 가지고있다. 모든 제품의 제품명은 Price입니다. 이 Price은 다른 제품 세트 (예 : Product - Set 1 ~ Product - Set 6)에 사용됩니다.상위 노드와 하위 노드의 최대 값 비교

는 지금은 모든 Companies을 통해 루프를 원하는 모든 Product Sets 1 to 6(in my example)의 가격이 Product - ALL 노드의 최대 인 경우 CompanyBuyer 같은 선택을 위해, 자신의 Buyers 및 테스트를 확인합니다.

나는 하나의 예와 함께이 시도 :

> dput(sys) 
structure(list(Company = c("Company 1", "Company 2", "Company 3", 
"Company 2", "Company 2", "Company 2", "Company 3", "Company 3", 
"Company 5", "Company 5", "Company 5", "Company 2", "Company 2", 
"Company 2", "Company 2", "Company 2"), Buyer = c("Buyer 1", 
"Buyer 2", "Buyer 1", "Buyer 1", "Buyer 1", "Buyer 2", "Buyer 2", 
"Buyer 1", "Buyer 3", "Buyer 1", "Buyer 3", "Buyer 2", "Buyer 2", 
"Buyer 2", "Buyer 2", "Buyer 2"), Products = c("Product - ALL", 
"Product - Set 1", "Product - Set 2", "Product - Set 1", "Product - ALL", 
"Product - ALL", "Product - ALL", "Product - Set 1", "Product - ALL", 
"Product - Set 1", "Product - Set 2", "Product - Set 2", "Product - Set 3", 
"Product - Set 4", "Product - Set 5", "Product - Set 6"), Price = c(NA, 
10L, 99L, 13L, 13L, 12L, 99L, 99L, 100L, 100L, 100L, 12L, NA, 
11L, 0L, 12L)), .Names = c("Company", "Buyer", "Products", "Price" 
), row.names = c(NA, -16L), class = c("data.table", "data.frame" 
), .internal.selfref = <pointer: 0x0000000000100788>) 
> 
> df <- sys[ (sys$Company =="Company 2" & sys$Buyer == "Buyer 2"), ] 
> 
> #replace all NAs with 0 
> df[is.na(df)] <- 0 
> 
> #Fill control column with null 
> df$ControlColumn <- "null" 
> 
> if(grep("Product - ALL", df)) { 
+ i <- grep("Product - ALL", df) 
+ prodSet1 <- grep("Product - Set 1", df$Products) 
+ prodSet2 <- grep("Product - Set 2", df$Products) 
+ prodSet3 <- grep("Product - Set 3", df$Products) 
+ prodSet4 <- grep("Product - Set 4", df$Products) 
+ prodSet5 <- grep("Product - Set 5", df$Products) 
+ prodSet6 <- grep("Product - Set 6", df$Products) 
+ val <- max(df[prodSet1]$Price, df[prodSet2]$Price,df[prodSet3]$Price,df[prodSet4]$Price,df[prodSet5]$Price,df[prodSet6]$Price) 
+ df[i]$Price == val 
+ df[i]$ControlColumn <- (df[i]$Price == val) 
+ } 

그러나, 나는 입력 데이터에 대해이 작업을 자동화 할 수 struggeling하고있다. 이 복잡한 문제에 대해이 프로세스를 자동화하는 방법에 대한 권장 사항은 무엇입니까?

나는 당신은 당신의 sys 데이터 세트가 data.table 사실의 더 나은 사용을 만들 수있는 답변

답변

2

을 주셔서 감사합니다.

첫째, 당신을 위해 가장 높은 가격으로 Products을 찾을 수 있습니다 주어진 CompanyBuyer (그리고 우리가 그 제품을 Products - All를 싶지 않아) :

max.prices <- sys[Products!='Product - ALL',.SD[which.max(Price)],by=.(Company,Buyer)] 
#  Company Buyer  Products Price 
# 1: Company 2 Buyer 2 Product - Set 2 12 
# 2: Company 3 Buyer 1 Product - Set 2 99 
# 3: Company 2 Buyer 1 Product - Set 1 13 
# 4: Company 5 Buyer 1 Product - Set 1 100 
# 5: Company 5 Buyer 3 Product - Set 2 100 

max.prices 추가 분석에서 다른 목적으로 유용 할 수 있습니다 오히려 max.prices을 수정하는 것보다 설정 다른 데이터를 생성 할 수 있습니다, 그래서 : 지금 모든

all.prods <- max.prices 
all.prods[,Products:='Product - ALL'] 
#  Company Buyer  Products Price 
# 1: Company 2 Buyer 2 Product - ALL 12 
# 2: Company 3 Buyer 1 Product - ALL 99 
# 3: Company 2 Buyer 1 Product - ALL 13 
# 4: Company 5 Buyer 1 Product - ALL 100 
# 5: Company 5 Buyer 3 Product - ALL 100 

을 '제품 - 모든'항목은 repla 될 수 있습니다 업데이트 된 사람에 의해 세드릭 : 귀하의 답변에 대한

setkey(result,Company,Buyer)  
result 
#  Company Buyer  Products Price 
# 1: Company 2 Buyer 1 Product - ALL 13 
# 2: Company 2 Buyer 1 Product - Set 1 13 
# 3: Company 2 Buyer 2 Product - ALL 12 
# 4: Company 2 Buyer 2 Product - Set 1 10 
# 5: Company 2 Buyer 2 Product - Set 2 12 
# 6: Company 2 Buyer 2 Product - Set 3 NA 
# 7: Company 2 Buyer 2 Product - Set 4 11 
# 8: Company 2 Buyer 2 Product - Set 5  0 
# 9: Company 2 Buyer 2 Product - Set 6 12 
# 10: Company 3 Buyer 1 Product - ALL 99 
# 11: Company 3 Buyer 1 Product - Set 2 99 
# 12: Company 3 Buyer 1 Product - Set 1 99 
# 13: Company 5 Buyer 1 Product - ALL 100 
# 14: Company 5 Buyer 1 Product - Set 1 100 
# 15: Company 5 Buyer 3 Product - ALL 100 
# 16: Company 5 Buyer 3 Product - Set 2 100 
+0

들으 :

result <- rbind(all.prods,sys[Products!='Product - ALL']) 

이 코드는 아래의 결과를 밖으로 인쇄를 정렬! 그것을 분류 한 후, Produc - All price가 하위 노드의 집계 된 값인지 정확하게 표시 할 수 있습니까? 내 목표는 교체보다는 점검하는 것이기 때문에? – mrquad

+1

예. 예상 출력을 보여줄 수 있습니까? –

+0

기본적으로 'Product - ALL' 노드를'TRUE '로 표시하는 colume을 올바르게 계산하면됩니다. – mrquad

관련 문제