# Reducing data

Here we demonstrate how to ask a few questions with "scalar" answers - like "Does the table contain x?", or "What is the average value of y?"

## Testing containment

One of the most basic questions to ask is: "Is this element in the table/column?". Julia's in operator is perfect for this.

julia> t = Table(name = ["Alice", "Bob", "Charlie"], age = [25, 42, 37])
Table with 2 columns and 3 rows:
name     age
┌─────────────
1 │ Alice    25
2 │ Bob      42
3 │ Charlie  37

julia> in("Alice", t.name)
true

julia> in("Debbie", t.name)
false


The in function can also be used as an infix operator, as in "Alice" in t.name or "Alice" ∈ t.name.

## "How many?"

The count method is useful for asking how many rows satisfy a certain criterion.

julia> count(row -> row.age > 40, t)
1


## Totals, averages, etc.

Individual columns can be reduced in the typical way for Julia arrays. Some examples.

julia> sum(t.age)
104

julia> using Statistics

julia> mean(t.age)
34.666666666666664

julia> median(t.age)
37.0

julia> join(t.name, ", ", " and ")
"Alice, Bob and Charlie"


Note that join is a string joining function; see innerjoin (from SplitApplyCombine) for the relational operation.

It's just as easy to calculate multi-column statistics by reducing over the entire table.

julia> mapreduce(row -> length(row.name) * row.age, +, t)
510