tapply splits a vector by group labels, applies a function to each group, and returns one result per group.

Program

Play the script to add a bonus, split scores by group, and average each group.

bonus
grouped_mean.R
Replay: real traced execution (multi-file project)
group <- c("A", "A", "B", "B")
values <- c(3, 5, 7, 9)
bonus <- 0
adjusted <- values + bonus
means <- tapply(adjusted, group, mean)
label <- paste(names(means), means, collapse = "; ")
cat(label, "\n", sep = "")
group <- c("A", "A", "B", "B")
values <- c(3, 5, 7, 9)
bonus <- 1
adjusted <- values + bonus
means <- tapply(adjusted, group, mean)
label <- paste(names(means), means, collapse = "; ")
cat(label, "\n", sep = "")
group <- c("A", "A", "B", "B")
values <- c(3, 5, 7, 9)
bonus <- 2
adjusted <- values + bonus
means <- tapply(adjusted, group, mean)
label <- paste(names(means), means, collapse = "; ")
cat(label, "\n", sep = "")
  1. group ← A, A, B, B

    1group <- c("A", "A", "B", "B")2values <- c(3, 5, 7, 9)
    values this stepA, A, B, Bgroup
  2. values ← 3, 5, 7, 9

    1group <- c("A", "A", "B", "B")2values <- c(3, 5, 7, 9)3bonus <- 0
    values this step3, 5, 7, 9values
  3. bonus ← 0

    2values <- c(3, 5, 7, 9)3bonus <- 04adjusted <- values + bonus
    values this step0bonus
  4. adjusted ← 3, 5, 7, 9

    3bonus <- 04adjusted <- values + bonus5means <- tapply(adjusted, group, mean)
    values this step3, 5, 7, 9adjusted3, 5, 7, 9values0bonus
  5. means ← A 4; B 8

    4adjusted <- values + bonus5means <- tapply(adjusted, group, mean)6label <- paste(names(means), means, collapse = "; ")
    values this stepA 4; B 8means3, 5, 7, 9adjustedA, A, B, Bgroup
  6. label ← A 4; B 8

    5means <- tapply(adjusted, group, mean)6label <- paste(names(means), means, collapse = "; ")7cat(label, "\n", sep = "")
    values this stepA 4; B 8labelA 4; B 8means
  7. cat(label, " ", sep = "")

    6label <- paste(names(means), means, collapse = "; ")7cat(label, "\n", sep = "")
    outputA 4; B 8
    values this stepA 4; B 8label
  1. group ← A, A, B, B

    1group <- c("A", "A", "B", "B")2values <- c(3, 5, 7, 9)
    values this stepA, A, B, Bgroup
  2. values ← 3, 5, 7, 9

    1group <- c("A", "A", "B", "B")2values <- c(3, 5, 7, 9)3bonus <- 1
    values this step3, 5, 7, 9values
  3. bonus ← 1

    2values <- c(3, 5, 7, 9)3bonus <- 14adjusted <- values + bonus
    values this step1bonus
  4. adjusted ← 4, 6, 8, 10

    3bonus <- 14adjusted <- values + bonus5means <- tapply(adjusted, group, mean)
    values this step4, 6, 8, 10adjusted3, 5, 7, 9values1bonus
  5. means ← A 5; B 9

    4adjusted <- values + bonus5means <- tapply(adjusted, group, mean)6label <- paste(names(means), means, collapse = "; ")
    values this stepA 5; B 9means4, 6, 8, 10adjustedA, A, B, Bgroup
  6. label ← A 5; B 9

    5means <- tapply(adjusted, group, mean)6label <- paste(names(means), means, collapse = "; ")7cat(label, "\n", sep = "")
    values this stepA 5; B 9labelA 5; B 9means
  7. cat(label, " ", sep = "")

    6label <- paste(names(means), means, collapse = "; ")7cat(label, "\n", sep = "")
    outputA 5; B 9
    values this stepA 5; B 9label
  1. group ← A, A, B, B

    1group <- c("A", "A", "B", "B")2values <- c(3, 5, 7, 9)
    values this stepA, A, B, Bgroup
  2. values ← 3, 5, 7, 9

    1group <- c("A", "A", "B", "B")2values <- c(3, 5, 7, 9)3bonus <- 2
    values this step3, 5, 7, 9values
  3. bonus ← 2

    2values <- c(3, 5, 7, 9)3bonus <- 24adjusted <- values + bonus
    values this step2bonus
  4. adjusted ← 5, 7, 9, 11

    3bonus <- 24adjusted <- values + bonus5means <- tapply(adjusted, group, mean)
    values this step5, 7, 9, 11adjusted3, 5, 7, 9values2bonus
  5. means ← A 6; B 10

    4adjusted <- values + bonus5means <- tapply(adjusted, group, mean)6label <- paste(names(means), means, collapse = "; ")
    values this stepA 6; B 10means5, 7, 9, 11adjustedA, A, B, Bgroup
  6. label ← A 6; B 10

    5means <- tapply(adjusted, group, mean)6label <- paste(names(means), means, collapse = "; ")7cat(label, "\n", sep = "")
    values this stepA 6; B 10labelA 6; B 10means
  7. cat(label, " ", sep = "")

    6label <- paste(names(means), means, collapse = "; ")7cat(label, "\n", sep = "")
    outputA 6; B 10
    values this stepA 6; B 10label
tapply `tapply(values, group, mean)` computes a summary inside each group.
vector recycling `values + bonus` adds one scalar to every element.
names `names(means)` returns the group labels carried by the summary.