2012-06-12 92 views
5

thể trùng lặp:
Calculating weighted mean and standard deviationCách tính trung bình có trọng số trong R?

Làm thế nào để tính toán giá trị trung bình có trọng trong R?

Ví dụ, tôi có 4 yếu tố trong đó 1 phần tử có kích thước (hoặc: chiều dài, chiều rộng, vv) 10 và 3 yếu tố có kích thước 2.

> z = data.frame(count=c(1,3), size=c(10,2)) 
> z 
    count size 
1  1 10 
2  3 2 

Các bình quân gia quyền là (10 * 1 + 2 * 3)/4 = 4.

+1

Tại sao lưu ý lại? – Frank

+6

Nói cho bản thân mình, tôi đã bỏ phiếu vì tìm kiếm trên google cho "trung bình có trọng số trong R" trả về trang trợ giúp cho weighted.mean là kết quả đầu tiên. – joran

+3

@Frank Di chuột qua hình tam giác xuống bên dưới số phiếu bầu bên cạnh chữ Q. Mẹo công cụ cho biết: "Câu hỏi này không hiển thị bất kỳ nỗ lực nghiên cứu nào; ...". Do ai đó ở đây đã yêu cầu một Q rất giống ở đây có thể dễ dàng tìm thấy thông qua tìm kiếm và tìm kiếm của Google đưa bạn đến Câu trả lời chính xác, đó có thể là lý do bạn có Downvotes và đã đóng Q của bạn. –

Trả lời

19

Sử dụng weighted.mean:

> weighted.mean(z$size, z$count) 
[1] 4 
11

Có vẻ như bạn đã biết làm thế nào để tính toán này, chỉ cần một lực đẩy đi đúng hướng để thực hiện nó. Kể từ R được vector hóa, điều này là khá đơn giản:

with(z, sum(count*size)/sum(count)) 

Bit with chỉ tiết kiệm về đánh máy và tương đương với sum(z$count*z$size)/sum(z$count)

Hoặc sử dụng được xây dựng trong chức năng weighted.mean() như bạn cũng chỉ ra. Sử dụng chức năng của riêng bạn có thể chứng minh nhanh hơn, mặc dù sẽ không làm cùng một lượng lỗi kiểm tra xem hàm dựng sẵn có thực hiện hay không.

builtin <- function() with(z, weighted.mean(count, size)) 
rollyourown <- function() with(z, sum(count*size)/sum(count)) 

require(rbenchmark) 
    benchmark(builtin(), rollyourown(), 
      replications = 1000000, 
      columns = c("test", "elapsed", "relative"), 
      order = "relative") 
#----- 
      test elapsed relative 
2 rollyourown() 13.26 1.000000 
1  builtin() 22.84 1.722474 
Các vấn đề liên quan