September 27, 2026

About the Dataset

The Palmer Penguins dataset contains measurements for 344 penguins observed on three islands in the Palmer Archipelago, Antarctica.

  • Species: Adelie, Chinstrap, Gentoo
  • Measurements: bill length, bill depth, flipper length, body mass
  • Other variables: island, sex, year

Data source: Allison Horst, palmerpenguins (GitHub)

Reading in the Data

url <- paste0("https://raw.githubusercontent.com/allisonhorst/",
              "palmerpenguins/main/inst/extdata/penguins.csv")
penguins <- read.csv(url)

dim(penguins)      # rows and columns
## [1] 344   8
names(penguins)    # variable names
## [1] "species"           "island"            "bill_length_mm"   
## [4] "bill_depth_mm"     "flipper_length_mm" "body_mass_g"      
## [7] "sex"               "year"

A First Look

knitr::kable(head(penguins, 5))
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year
Adelie Torgersen 39.1 18.7 181 3750 male 2007
Adelie Torgersen 39.5 17.4 186 3800 female 2007
Adelie Torgersen 40.3 18.0 195 3250 female 2007
Adelie Torgersen NA NA NA NA NA 2007
Adelie Torgersen 36.7 19.3 193 3450 female 2007

Checking for Missing Values

colSums(is.na(penguins))
##           species            island    bill_length_mm     bill_depth_mm 
##                 0                 0                 2                 2 
## flipper_length_mm       body_mass_g               sex              year 
##                 2                 2                11                 0

A few penguins are missing measurements, so the calculations that follow use na.rm = TRUE to skip those values.

Summary Statistics

num_vars <- c("bill_length_mm", "bill_depth_mm",
              "flipper_length_mm", "body_mass_g")

stats <- data.frame(
  Variable = num_vars,
  Mean   = sapply(penguins[num_vars], mean,   na.rm = TRUE),
  Median = sapply(penguins[num_vars], median, na.rm = TRUE),
  SD     = sapply(penguins[num_vars], sd,     na.rm = TRUE),
  Min    = sapply(penguins[num_vars], min,    na.rm = TRUE),
  Max    = sapply(penguins[num_vars], max,    na.rm = TRUE)
)
knitr::kable(stats, digits = 1, row.names = FALSE)
Variable Mean Median SD Min Max
bill_length_mm 43.9 44.5 5.5 32.1 59.6
bill_depth_mm 17.2 17.3 2.0 13.1 21.5
flipper_length_mm 200.9 197.0 14.1 172.0 231.0
body_mass_g 4201.8 4050.0 802.0 2700.0 6300.0

Penguins by Species

table(penguins$species)
## 
##    Adelie Chinstrap    Gentoo 
##       152        68       124
mass_by_species <- aggregate(body_mass_g ~ species,
                             data = penguins, FUN = mean)
knitr::kable(mass_by_species, digits = 0,
             col.names = c("Species", "Mean Body Mass (g)"))
Species Mean Body Mass (g)
Adelie 3701
Chinstrap 3733
Gentoo 5076

Body Mass by Species

Takeaways

  • The dataset has 344 penguins and 8 variables, with only a small number of missing values.
  • Gentoo penguins are the heaviest species on average, at about 5,000 g.
  • Adelie and Chinstrap penguins have similar average body mass, around 3,700 g.
  • R Markdown lets the code, results, and slides live in one file, so the presentation updates automatically if the data changes.