2016-11-11 4 views
0

가 여기에 내가 취급하고있어 매우 간단한 예제 값 :가중 평균 값은

data_stack <- data.table(CompA_value = c(10,20,30,40), CompB_value = c(60,70,80,80), CompC_value = c(NA, NA, NA, 100), CompA_weight = c(0.2, 0.3,0.4,0.4), CompB_weight = c(0.8,0.7,0.6,0.4), CompC_weight = c(NA, NA, NA,0.2)) 

    CompA_value CompB_value CompC_value CompA_weight CompB_weight CompC_weight 
1:   10   60   NA   0.2   0.8   NA 
2:   20   70   NA   0.3   0.7   NA 
3:   30   80   NA   0.4   0.6   NA 
4:   40   80   100   0.4   0.4   0.2 

내가 각 행에 대해, C를 통해 안돼요의 가중 평균을 계산되고 싶지 . 그러나 CompC에는 행 1-3에 대해 NAs가 있습니다. 내가 좋아하는 것은 행 1-3에 대해 CompA와 CompB의 가중 평균을 구하는 것이지만 일단 CompC가 활성화되면 계산에 자동으로 포함시키고 싶습니다.

> data_stack[, Weighted_average := CompA_value*CompA_weight + CompB_value*CompB_weight + CompC_value * CompC_weight] 
> data_stack 
    CompA_value CompB_value CompC_value CompA_weight CompB_weight CompC_weight Weighted_average 
1:   10   60   NA   0.2   0.8   NA    NA 
2:   20   70   NA   0.3   0.7   NA    NA 
3:   30   80   NA   0.4   0.6   NA    NA 
4:   40   80   100   0.4   0.4   0.2    68 

하지만 내 "Weighted_average"열은 분명 처음 1-3 행에 대해 나에게 가중치를 부여하지 않습니다

약자로

는,이 같은 짓을했습니다.

data_stack[, Weighted_average := c((10*0.2 + 60*0.8),(20*0.3 + 70*0.7),(30*0.4 + 80*0.6),(40*0.4 + 80*0.4 + 100*0.2))] 
data_stack 
    CompA_value CompB_value CompC_value CompA_weight CompB_weight CompC_weight Weighted_average 
1:   10   60   NA   0.2   0.8   NA    50 
2:   20   70   NA   0.3   0.7   NA    55 
3:   30   80   NA   0.4   0.6   NA    60 
4:   40   80   100   0.4   0.4   0.2    68 

그래서, 처음 세 행이 A와 B의 단지 가중 평균 얼마나주의,하지만 C를 사용할 수있게되면, 그것은 또한 계산에 포함되어

은 내가 원하는 것입니다.

그래서 NA 값이 있는지 여부를 판단하는 코드를 작성하는 방법을 알아보고 싶습니다. 그렇다면이를 건너 뛰고 계산에 포함시키지 마십시오.

필자는 상당히 큰 데이터 테이블을 가지므로 수동으로 수행하는 것이 좋습니다.

감사합니다. 여기

+2

모든 NA를 0으로 바꾸고 가중 평균을 취할 수 있습니다. –

+0

'data_stack [is.na (data_stack)] <- 0'을 사용해 보지 않겠습니까? – Aramis7d

답변

1

당신은 이동 :

data_stack$Weighted_average = apply(data_stack,1,function(x){ 
    y = c(x["CompA_value"]*x["CompA_weight"], 
     x["CompB_value"]*x["CompB_weight"], 
     x["CompC_value"]*x["CompC_weight"]) 
    return(sum(y,na.rm = T)) 
}) 

결과 :

> data_stack 
    CompA_value CompB_value CompC_value CompA_weight CompB_weight CompC_weight Weighted_average 
1   10   60   NA   0.2   0.8   NA    50 
2   20   70   NA   0.3   0.7   NA    55 
3   30   80   NA   0.4   0.6   NA    60 
4   40   80   100   0.4   0.4   0.2    68 

기능은 각 열에 대해 * 값으로 무게를 벡터를 생성한다. 그런 다음 NA 값을 무시한 합계를 반환합니다. 이는 모든 열의 NA 값을 무시한다는 것을 의미합니다.