tidy_report.R en R
Un pipeline tidyverse entero: leer, limpiar, reformar, modelar por grupo, graficar.
suppressPackageStartupMessages({
library(dplyr)
library(tidyr)
library(readr)
library(purrr)
library(stringr)
library(ggplot2)
})
RAW <- "session,lang,chars,seconds,errors
1,r,1520,60,4
2,r,1680,60,3
3,r,1810,60,2
4,r,1900,60,2
1,python,1740,60,5
2,python,1880,60,3
3,python,2010,60,1
4,python,2120,60,1
1,sql,1180,60,6
2,sql,1240,60,4
3,sql,1310,60,3
"
runs <- read_csv(RAW, show_col_types = FALSE) |>
mutate(
wpm = (chars / 5) / (seconds / 60),
accuracy = (1 - errors / chars) * 100,
lang = str_to_title(lang)
)
cat("--- per language ---\n")
summary_table <- runs |>
summarise(
sessions = n(),
best_wpm = max(wpm),
mean_wpm = mean(wpm),
mean_accuracy = mean(accuracy),
.by = lang
) |>
arrange(desc(mean_wpm)) |>
mutate(across(where(is.numeric), \(x) round(x, 1)))
print(summary_table)
cat("\n--- improvement per session ---\n")
slopes <- runs |>
nest(.by = lang) |>
mutate(
model = map(data, \(d) lm(wpm ~ session, data = d)),
per_session = map_dbl(model, \(m) coef(m)[["session"]]),
r_squared = map_dbl(model, \(m) summary(m)$r.squared)
) |>
select(lang, per_session, r_squared) |>
mutate(across(where(is.numeric), \(x) round(x, 3)))
print(slopes)
cat("\n--- wide view ---\n")
print(runs |>
select(lang, session, wpm) |>
mutate(wpm = round(wpm)) |>
pivot_wider(names_from = session, values_from = wpm,
names_prefix = "s"))
plot <- runs |>
ggplot(aes(session, wpm, colour = lang)) +
geom_point(size = 2) +
geom_smooth(method = "lm", formula = y ~ x, se = FALSE, linewidth = 0.8) +
scale_x_continuous(breaks = 1:4) +
labs(title = "Words per minute by session", x = "session", y = "wpm") +
theme_minimal()
out <- tempfile(fileext = ".png")
ggsave(out, plot, width = 6, height = 3.5, dpi = 120)
cat("\nwrote", basename(out), "\n")
Cómo funciona
- Cada etapa es un verbo en un mismo pipeline, sin variables sueltas.
- El modelo por grupo vive en una columna de listas.
- El gráfico sale del final del mismo pipeline.
El intento, en números
- Líneas
- 73
- Caracteres a escribir
- 1736
- Tokens
- 441
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 241 segundos.
Paso 1 de 1 en Bis; paso 12 de 12 en Remodelar y leer.