How to find the median and mean of an array in Ruby
Tags: ruby, median, mean, average
Published: 2020-05-24 01:38:02

# Finding the Median

### The Code: 
```ruby
array = [172, 185, 160, 230, 50, 185, 190]

sorted_array = array.sort 
count = sorted_array.count 

if sorted_array.count % 2 == 0 
  first_half = (sorted_array[0...(count/2)])
  second_half = (sorted_array[(count/2)..-1])

  first_median = first_half[-1]
  second_median = second_half[0]

  true_median = ((first_median + second_median).to_f / 2.to_f)
  true_median
else 
  true_median = sorted_array[(count/2).floor]
  true_median
end 
```
### Code Explanation: 
The median is the middle number of an array sorted from lowest to highest number. We begin with an array. We then sort the array from lowest to highest number with `.sort`. Then we get the amount of elements in the array with `.count`. Next we set up a conditional `if, else` statement: If the sorted array has an even amount of numbers in it, we execute the code after the `if`. If the sorted array has an odd amount of numbers, we execute the code after the `else`. 

(The code `if sorted_array.count % 2 == 0` is saying, "If the remainder of the amount of elements in the sorted array divided by 2 is 0, then execute the code below the `if` statement." The `%` operator in Ruby returns the remainder after dividing the number to the left of the `%` by the number to the right. We perform the operation `sorted_array.count % 2 == 0` to check if the array has an even amount of numbers because all even numbers, when divided by 2, will have a remainder of 0).

Assuming the array has an even amount of numbers, we first split up the array into two parts: The `first_half` is the sorted array from the first element to the element before the element at `sorted_array[(count/2)]`. (The `...` here means exclude the second argument but leave all the stuff in before it). The `second_half` is the sorted array from the element at `sorted_array[(count/2)]` to the last element. (Here the `..` means include the second argument; the -1 means the last element of the array). Next, the variable `first_median` is the last element of the array found in the `first_half` variable. The variable `second_median` is the first element of the array found in the `second_half` variable. Now, we need to take the average of our two elements to receive the actual median value. We do this with `true_median = ((first_median + second_median).to_f / 2.to_f)`. The `.to_f` is important to have because without it Ruby will do integer division and you may end up with a rounded, imprecise answer. Finally, we return the value of `true_median`. 

Assuming the array has an odd amount of numbers, we can find the median by taking the sorted array and finding the element at `(count/2).floor`. The `.floor` rounds down to the nearest integer and is essential to get the right answer. Finally, we return the value of `true_median`. 

---

# Finding the Mean (Average)

### The Code: 
```ruby
array = [172, 185, 160, 230, 50, 185, 190]

numerator = array.reduce(0) { |a, v| a + v }
denominator = array.count
mean = numerator.to_f / denominator.to_f 
mean
```
### Code Explanation:
The mean (or average) is calculated by adding up all the numbers and then dividing by the amount of numbers. 

We begin by using the `reduce` enumerator, which goes through each element of the array, adding each element to an accumulator. The `(0)` is the starting value of the accumulator in this case. Each element of the array gets added to `0`. The `a` stands for accumulator and the `v` stands for value (or element of the array). The `reduce` enumerator lets us find the *numerator* of the mathematical expression for the mean. 

To find the *denominator*, we get the amount of numbers in the array with `.count`. 

Finally, we convert the numerator and denominator into floats with `.to_f` and divide the numerator by the denominator. Finally, we return the `mean` variable. 

---

Let me know in the comments if you have a different/faster/simpler way to calculate the mean and median!