I. Introduction

Meteorites are small pieces of rock that come from space and land on earth. NASA tracks meteorites - where they fell and when they fell - and it’s no surprise that the distribution of meteorites in the US is not equally distributed. This report explores where meteorites have fallen in the U.S. since 1900 and reveals that the central U.S. may be the best area in the country to find meteorites! The data for this report can be downloaded from the NASA Open Data Portal.

II. Data Preparation

We start by loading necessary packages

# load packages
library(janitor)
library(leaflet)
library(sf)
library(tidyverse)
library(dplyr)
library(htmltools)
library(RColorBrewer)

Then we load the data

# load data
meteorites <- read_csv("Meteorite_Landings.csv")

It’s important to clean the data. We’ll do this by tidying column names, dropping null values, and filter for events after 1900. We’ll also create a new column for the log(mass) of each meteorite. This allows us to normalize the distribution of this variable, which we then scale from 1 to 10 to be used later for point symbolization. (ChatGPT helped to create the code for the log_mass scale.)

# clean data (tidy columns, drop nulls, filter by year, create
# log_mass column to normalize values)
meteorites <- meteorites %>%
  clean_names() %>%
  drop_na() %>%
  filter(year >= 1900) %>%
  mutate(
    log_mass = log10(mass_g + 1),  # log transform
    log_mass = (log_mass - min(log_mass)) / 
      (max(log_mass) - min(log_mass)),  # normalize 0–1
    log_mass = log_mass * 9 + 1  # scale to 1–10 for marker radius
  )

# view data
glimpse(meteorites)
## Rows: 37,409
## Columns: 11
## $ name         <chr> "Aarhus", "Abee", "Acapulco", "Achiras", "Adhi Kot", "Adz…
## $ id           <dbl> 2, 6, 10, 370, 379, 390, 398, 417, 423, 424, 426, 432, 43…
## $ nametype     <chr> "Valid", "Valid", "Valid", "Valid", "Valid", "Valid", "Va…
## $ recclass     <chr> "H6", "EH4", "Acapulcoite", "L6", "EH4", "LL3-6", "L6", "…
## $ mass_g       <dbl> 720, 107000, 1914, 780, 4239, 910, 1620, 1440, 1000, 2400…
## $ fall         <chr> "Fell", "Fell", "Fell", "Fell", "Fell", "Fell", "Fell", "…
## $ year         <dbl> 1951, 1952, 1976, 1902, 1919, 1949, 1930, 1920, 1974, 192…
## $ reclat       <dbl> 56.18333, 54.21667, 16.88333, -33.16667, 32.10000, 44.833…
## $ reclong      <dbl> 10.23333, -113.00000, -99.90000, -64.95000, 71.80000, 95.…
## $ geo_location <chr> "(56.18333, 10.23333)", "(54.21667, -113.0)", "(16.88333,…
## $ log_mass     <dbl> 4.306881, 6.819441, 4.797756, 4.347050, 5.197179, 4.42442…

III. Data Mapping

With the data loaded, we’ll create a basic leaflet map

# basic leaflet map
leaflet(meteorites) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~reclong,
    lat = ~reclat,
    radius = 3,
    color = "red",
    stroke = FALSE,
    fillOpacity = 0.6
  )

It’s interesting to note that there is a category for “fall”. I want to get unique values for this column, because it might indicate meteorites that have been found or not.

# get unique values for column "fall"
unique(meteorites$fall)
## [1] "Fell"  "Found"

The “Fall” attribute indicates whether meteorites or not a meteorite has been found. It would be very interesting to know how many meteorites have been found. We’ll use this information to update our color palette.

# create a color palette
pal <- colorFactor(
  palette = c("cyan", "orange"),  # two colors for "fell" and "found"
  domain = meteorites$fall
)

Another question is where are the largest meteorites found. We will want to add weight information to our pop-up, along with meteorite name, fall status, and the year is fell.

# create content popup
popup_content <- paste0(
  "<b>", meteorites$name, "</b><br>",
  "Type: ", meteorites$fall, "<br>",
  "Mass: ", round(meteorites$mass_g, 1), " g",
  " (", round(meteorites$mass_g * 0.00220462, 2), " lbs)<br>",
  "Year: ", meteorites$year
)

We’ll also create a label for the points with meteorite name and fall status.

# add labels
labels <- sprintf(
  "<strong>%s</strong><br/>%s",
  meteorites$name,
  meteorites$fall
) %>% lapply(htmltools::HTML)

Lastly, we’ll update the map with our customization. We’ll use a dark base map that makes the points pop; center the map on the United States; update the point symbology, popups, and labels; and add a legend.

# update leaflet map
leaflet(meteorites) %>%
  addProviderTiles(providers$CartoDB.DarkMatter) %>%
  
  # set view to center map on United States
  setView(lng = -98.5, lat = 39.8, zoom = 4) %>%  # US-centered
  
  # add circle markers and update symbology
  addCircleMarkers(
    lng = ~reclong,
    lat = ~reclat,
    radius = ~log_mass,
    color = ~pal(fall),
    stroke = FALSE,
    fillOpacity = 0.8,
    popup = popup_content,
    label = labels) %>%
  
  # Legend for Fell vs Found
  addLegend(
    "bottomright",
    pal = pal,
    values = ~fall,
    title = "Meteorite Status",
    opacity = 1
  )

IV. Results

The results of the interactive map show a concentration of found meteorites in the United States since 1900 lies within the central US. In the central US, northern Texas and western New Mexico seem to have the most dense concentration of found meteorites. Interestingly, the eastern half of the United States seems to contain most of the United States’ “to-be-found” meteorites. more meteorites that have yet to be found seem to be in the eastern half of the United States. Zooming out, I can also see some very large meteorites have been found in the western US - including “Willamette,” a 34,171 lb. meteorite found outside of Portland, Oregon in 1902. Wow! Where do you think the next Willamette be found?

Willamette in a museum. Image source