2009-05-18 1 views
2

은, 그것은 주사한다 충분히 간단 0 25 53 80배열의 평균 집합에 대한 Ruby의 가장 좋은 방법은 무엇입니까? 다음과 같은 간단한 데이터 집합을 감안할 때

[["0", "148.5"], 
    ["0", "146.5"], 
    ["0", "148.6"], 
    ["0", "202.3"], 
    ["25", "145.7"], 
    ["25", "145.5"], 
    ["25", "147.4"], 
    ["25", "147.3"], 
    ["53", "150.4"], 
    ["53", "147.6"], 
    ["53", "147.8"], 
    ["53", "215.4"], 
    ["80", "150.4"], 
    ["80", "149.4"], 
    ["80", "148.0"], 
    ["80", "149.9"]] 
+0

문구를 다시 사용할 수 있습니까? 네가 무엇을 요구하는지 이해하지 못한다. 답이 도움이 될 것입니다. –

+0

제이슨 코드가 내가 찾고있는 코드를 반환합니다. { "80"=> 149.425, "25"=> 146.475, "0"=> 161.475, "53"=> 165.3} –

답변

6

세트의 값을 평균하는 가장 좋은 방법은 무엇입니까. 나는 종종 이런 일을 돕기 위해 프로젝트에서 일반적인 group_by 메소드를 구현한다.

데이터가 크고 성능 측면에서 적절한 경우 숫자 라이브러리 또는 데이터베이스를 사용하는 것이 좋습니다.

data = [ ... ] 

groups = data.inject({}) do |hash, pair| 
    hash[pair.first] ||= [] 
    hash[pair.first] << pair.last.to_f 
    hash 
end 

groups.inject({}) do |hash, pair| 
    hash[pair.first] = pair.last.inject(0,&:+)/pair.last.size 
    hash 
end 
+0

brilliant! 설명 할 수 있습니까? 아니면 어떤 문서를 가리켜 & : +? 나는 주사가 초기 값과 블록 이외에 인수를 취했는지, 또는 블록인지를 몰랐다. 우와, 나는 네가 내 마음을 날려 버린 것 같아! –

+0

그것은 블록입니다 : http://blog.hasmanythrough.com/2006/3/7/symbol-to-proc-shorthand '& : foo'는': foo.to_proc'에 대한 구문 적 설탕입니다. 'Symbol # to_proc'은'Proc' 객체를 보내는 메소드를 래핑하기 위해 편리하게 작성됩니다. 단축형이지만, 성능상의 오버 헤드가 있기 때문에 성능에 중요한 내부 루프에는 사용하지 마십시오. –

+0

Doh, 코드 다운 혼란에 대해 사과하고, 의견이 답변과 동일하게 필터링되지 않았다는 사실을 깨닫지 못했습니다. –

1

해시로 주입을 사용하면 성능이 떨어집니다 (모든 반복마다 메모 var를 다시 할당 함). 데이터 것을

Array#average

result = array.map{ |row| [row.first.to_i, row.last.to_f] }.group_by(&:first) 
result.each_pair do |key, values| 
    result[key] = values.average 
end 
쉽게

class Array 
    def average 
    inject(0.0) { |sum, e| sum + e }/length 
    end 
end 

같은 사실을 구현됩니다 : 당신은 1.9에 있다면, Enumerable에서 좀 더 확실한 코드를 만드는 데 사용할 수있는 방법 group_by를 구현 문자열이 매우 불편하므로 가능할 때마다 피하는 것이 좋습니다.

+0

"매 반복마다 메모 var를 다시 할당"한다는 의미를 설명 할 수 있습니까? 호출은 참조에 의해 수행되므로 변수의 할당에는 값의 유형에 관계없이 동일한 오버 헤드가 포함됩니다. –

관련 문제