Statistical Summaries
Grouped Mean
Summaries by Label
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.
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 = "")
group ← A, A, B, B
1group <- c("A", "A", "B", "B")2values <- c(3, 5, 7, 9)values this stepA, A, B, Bgroupvalues ← 3, 5, 7, 9
1group <- c("A", "A", "B", "B")2values <- c(3, 5, 7, 9)3bonus <- 0values this step3, 5, 7, 9valuesbonus ← 0
2values <- c(3, 5, 7, 9)3bonus <- 04adjusted <- values + bonusvalues this step0bonusadjusted ← 3, 5, 7, 9
3bonus <- 04adjusted <- values + bonus5means <- tapply(adjusted, group, mean)values this step3, 5, 7, 9adjusted3, 5, 7, 9values0bonusmeans ← 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, Bgrouplabel ← 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 8meanscat(label, " ", sep = "")
6label <- paste(names(means), means, collapse = "; ")7cat(label, "\n", sep = "")outputA 4; B 8values this stepA 4; B 8label
group ← A, A, B, B
1group <- c("A", "A", "B", "B")2values <- c(3, 5, 7, 9)values this stepA, A, B, Bgroupvalues ← 3, 5, 7, 9
1group <- c("A", "A", "B", "B")2values <- c(3, 5, 7, 9)3bonus <- 1values this step3, 5, 7, 9valuesbonus ← 1
2values <- c(3, 5, 7, 9)3bonus <- 14adjusted <- values + bonusvalues this step1bonusadjusted ← 4, 6, 8, 10
3bonus <- 14adjusted <- values + bonus5means <- tapply(adjusted, group, mean)values this step4, 6, 8, 10adjusted3, 5, 7, 9values1bonusmeans ← 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, Bgrouplabel ← 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 9meanscat(label, " ", sep = "")
6label <- paste(names(means), means, collapse = "; ")7cat(label, "\n", sep = "")outputA 5; B 9values this stepA 5; B 9label
group ← A, A, B, B
1group <- c("A", "A", "B", "B")2values <- c(3, 5, 7, 9)values this stepA, A, B, Bgroupvalues ← 3, 5, 7, 9
1group <- c("A", "A", "B", "B")2values <- c(3, 5, 7, 9)3bonus <- 2values this step3, 5, 7, 9valuesbonus ← 2
2values <- c(3, 5, 7, 9)3bonus <- 24adjusted <- values + bonusvalues this step2bonusadjusted ← 5, 7, 9, 11
3bonus <- 24adjusted <- values + bonus5means <- tapply(adjusted, group, mean)values this step5, 7, 9, 11adjusted3, 5, 7, 9values2bonusmeans ← 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, Bgrouplabel ← 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 10meanscat(label, " ", sep = "")
6label <- paste(names(means), means, collapse = "; ")7cat(label, "\n", sep = "")outputA 6; B 10values 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.