2017-10-01 3 views
0

값이 누락 된 경우 R의 가중 평균을 계산할 수 있고 값이 누락 된 경우 기존 값의 가중치가 그에 비례하여 상향 조정됩니까?누락 된 값이있는 R의 가중 평균 계산

이 사실을 명확하게 전달하기 위해 가상 시나리오를 만들었습니다. 이것은 누락 된 값에 따라 각 행에 대해 스칼라를 조정해야하는 질문의 루트를 설명합니다.

Image: Weighted Mean Calculation

File: Weighted Mean Calculation in Excel

+0

그것은 자신을 갈 필요 당신이 문제에 실행 경우 여기에 몇 가지 예제 코드를 게시하려고 R.에서 할 확실히 가능 : 다음은이 작업을 수행 할 수있는 tidyverse 방법입니다. –

+0

감사합니다. 관련 질문에는 비슷한 코드 샘플이 많이 있습니다. [link] (https://stackoverflow.com/questions/40541172/weighted-average-value-in-the-presence-of-naues-rq=1), N/A가있을 때 가장 많이 변이하거나 평균으로 대체하거나 0으로 대체하려는 것 같습니다. 부담스럽지 않고 같은 질문을하지 않고서도 나머지 변수를 다시 조정하려는 내 사례와의 명시적인 차이를 표시하는 것이 더 쉬울 수도 있다고 생각했습니다. 나는 그것을 다른 곳에서 보지 못했다. 그리고 그것은 ** na.rm **을 사용하여 명백하고 짧은 대답 일 수 있습니다. – milaske

답변

0

당신이 필요로하는 결과를 얻을 수 있어야 인수 na.rm = TRUE와 기본 stats 패키지에서 weighted.mean 사용.

library(tidyverse) 
scores <- tribble(
~student, ~test1, ~test2, ~test3, 
    "Mark",  90,  91,  92, 
    "Mike",  NA,  79,  98, 
    "Nick",  81,  NA,  83) 

weights <- tribble(
    ~test, ~weight, 
    "test1",  0.2, 
    "test2",  0.4, 
    "test3",  0.4) 

scores %>% 
    gather(test, score, -student) %>% 
    left_join(weights, by = "test") %>% 
    group_by(student) %>% 
    summarise(result = weighted.mean(score, weight, na.rm = TRUE)) 
#> # A tibble: 3 x 2 
#> student result 
#>  <chr> <dbl> 
#> 1 Mark 91.20000 
#> 2 Mike 88.50000 
#> 3 Nick 82.33333 
+0

@ markdly 감사합니다. 나는 차트가없고 질문을하고 파일을 능가하는 훨씬 쉬운 방법이 있다고 가정합니다. 문서를 기반으로 이해할 수 없었던 것은 ** na.rm **의 영향이었습니다. 이를 TRUE로 지정하면 데이터가있는 변수를 기반으로 기존 가중치를 자동으로 조정하는 내 문제의 근본 원인을 해결할 수 있음을 확인했습니다. 누락 된 변수가 행마다 다르므로 훨씬 더 어려워 질 것이라고 생각했습니다. 다시 한번 감사드립니다. – milaske

0

예를 들어 데이터 집합을 게시하는 가장 좋은 방법은 dat은 데이터 세트의 이름입니다 dput(head(dat, 20))을 사용하는 것입니다. 그래픽 이미지는 정말 나쁜 선택입니다.
DATA.

dat <- 
structure(list(Test1 = c(90, NA, 81), Test2 = c(91, 79, NA), 
    Test3 = c(92, 98, 83)), .Names = c("Test1", "Test2", "Test3" 
), row.names = c("Mark", "Mike", "Nick"), class = "data.frame") 

w <- 
structure(list(Test1 = c(18, NA, 27), Test2 = c(36.4, 39.5, NA 
), Test3 = c(36.8, 49, 55.3)), .Names = c("Test1", "Test2", "Test3" 
), row.names = c("Mark", "Mike", "Nick"), class = "data.frame") 

CODE.
기본 패키지 statssapply에 함수 weighted.mean을 사용할 수 있습니다. 메모 및 가중치의 데이터 집합이 matrix 클래스의 R 개체 인 경우 unlist이 필요하지 않습니다.

sapply(seq_len(nrow(dat)), function(i){ 
    weighted.mean(unlist(dat[i,]), unlist(w[i, ]), na.rm = TRUE) 
}) 
+0

감사합니다. 비슷한 데이터와 코드를 가진 많은 관련 게시물이 있으며, 내가 이미지를 게시 한 이유는 다른 곳에서는 보지 못했던 기존 요인을 확장하는 중요성을 명시 적으로 보여주는 것이 었습니다. 문서 [link] (https://stat.ethz.ch/R-manual/R-devel/library/stats/html/weighted.mean.html)에서 ** na.rm **은 계산이 진행되기 전에 x의 NA 값을 제거해야하는지 여부 이것을 TRUE로 표시합니다. 이것은 자동으로 재 가중치를 처리합니까? – milaske

+0

@milaske 저는 믿습니다. 예를 들어, 링크가 '숫자를 as.numeric로 숫자에 강요하고 합계를 1로 합니다'라고 말한 것처럼 말입니다. 그리고 내 테스트에서 결과는 반올림 문제가있는 경우에만 귀하의 것과 동일합니다. –