A tidy table keeps one observation per row and records the measurement name in a column.

Program

Play the script to choose a measurement type, filter matching rows, and average their values.

metric_index
tidy_rows.R
Replay: real traced execution (multi-file project)
measurements <- data.frame(site = c("north", "north", "south", "south"), metric = c("temp", "rain", "temp", "rain"), value = c(18, 4, 21, 6))
metric_index <- 1
metric <- c("temp", "rain")[metric_index]
selected <- measurements[measurements$metric == metric, ]
average <- mean(selected$value)
cat(average, "\n", sep = "")
measurements <- data.frame(site = c("north", "north", "south", "south"), metric = c("temp", "rain", "temp", "rain"), value = c(18, 4, 21, 6))
metric_index <- 2
metric <- c("temp", "rain")[metric_index]
selected <- measurements[measurements$metric == metric, ]
average <- mean(selected$value)
cat(average, "\n", sep = "")
  1. measurements ← 4 rows x 3 cols

    1measurements <- data.frame(site = c("north", "north", "south", "south"), metric = c("temp", "rain", "temp", "rain"), value = c(18, 4, 21, 6))2metric_index <- 1
    values this step4 rows x 3 colsmeasurements
  2. metric_index ← 1

    1measurements <- data.frame(site = c("north", "north", "south", "south"), metric = c("temp", "rain", "temp", "rain"), value = c(18, 4, 21, 6))2metric_index <- 13metric <- c("temp", "rain")[metric_index]
    values this step1metric_index
  3. metric ← temp

    2metric_index <- 13metric <- c("temp", "rain")[metric_index]4selected <- measurements[measurements$metric == metric, ]
    values this steptempmetric1metric_index
  4. selected ← 2 rows x 3 cols

    3metric <- c("temp", "rain")[metric_index]4selected <- measurements[measurements$metric == metric, ]5average <- mean(selected$value)
    values this step2 rows x 3 colsselectedtempmetric
  5. average ← 19.5

    4selected <- measurements[measurements$metric == metric, ]5average <- mean(selected$value)6cat(average, "\n", sep = "")
    values this step19.5average18, 21selected$value
  6. cat(average, " ", sep = "")

    5average <- mean(selected$value)6cat(average, "\n", sep = "")
    output19.5
    values this step19.5average
  1. measurements ← 4 rows x 3 cols

    1measurements <- data.frame(site = c("north", "north", "south", "south"), metric = c("temp", "rain", "temp", "rain"), value = c(18, 4, 21, 6))2metric_index <- 2
    values this step4 rows x 3 colsmeasurements
  2. metric_index ← 2

    1measurements <- data.frame(site = c("north", "north", "south", "south"), metric = c("temp", "rain", "temp", "rain"), value = c(18, 4, 21, 6))2metric_index <- 23metric <- c("temp", "rain")[metric_index]
    values this step2metric_index
  3. metric ← rain

    2metric_index <- 23metric <- c("temp", "rain")[metric_index]4selected <- measurements[measurements$metric == metric, ]
    values this steprainmetric2metric_index
  4. selected ← 2 rows x 3 cols

    3metric <- c("temp", "rain")[metric_index]4selected <- measurements[measurements$metric == metric, ]5average <- mean(selected$value)
    values this step2 rows x 3 colsselectedrainmetric
  5. average ← 5

    4selected <- measurements[measurements$metric == metric, ]5average <- mean(selected$value)6cat(average, "\n", sep = "")
    values this step5average4, 6selected$value
  6. cat(average, " ", sep = "")

    5average <- mean(selected$value)6cat(average, "\n", sep = "")
    output5
    values this step5average
tidy rows Each row is one observation: a site, a metric name, and a value.
filter `measurements$metric == metric` keeps rows for the chosen measurement.
summary `mean(selected$value)` summarizes only the filtered rows.