typestar

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

  1. Cada etapa es un verbo en un mismo pipeline, sin variables sueltas.
  2. El modelo por grupo vive en una columna de listas.
  3. 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.

Escribe este fragmento

Paso 1 de 1 en Bis; paso 12 de 12 en Remodelar y leer.

← Anterior