Advent of Code 2017 in #rstats: Day 5

This went smoothly.  No tricky parts and Part 2 was a simple extension of Part 1.  No packages needed to solve (I used testthat for checking against the test input).

This was a textbook case for a while loop, which I rarely use in R.


Advent of Code 2017 in #rstats: Day 4

Whew, much easier than day 3.  Probably would be a great day to learn the tidytext package but I’ll be faster just muddling through with my current tools.

I wrote a function that compares the length of the input tokens to length of unique() input tokens.  Then for part 2, I added an argument as to whether anagrams should be permitted; if not, the tokens are each sorted alphabetically first into alphagrams (a word borrowed from competitive Scrabble).

Parts 1 & 2 together

I borrowed the string sorting algorithm from StackOverflow – I cited it below and upvoted as well 🙂

Now it’s just a matter of testing & running:

Advent of Code 2017 in #rstats: Day 2

After reading this puzzle, I was excited and concerned to see “spreadsheet”:

  1. Excited: R is good at rectangular numeric data, and I work with a lot of spreadsheets
  2. Concerned: Will I be starting with a single long string?  How do I get that into rectangular form?

After considering trying to chop up one long string, I copy-pasted my input to a text file and read.delim() worked on the first try.

Part 1 was simple, Part 2 was tricky.  The idea of row-wise iteration got in my head and I spent a lot of time with apply and lapply… I still hold a grudge against them from battles as a new R user, but having (mostly) bent them to my will I went to them here.  Maybe I should spend more time with the purrr package.

Part 1


Part 2

Got the idea quickly, but executing took a bit longer.  I decided right away that I would:

  1. Work on a function that tackled a row (as a vector) at a time
  2. The function would divide every value in the vector by every other value in the vector
  3. It would then pick out the integer that wasn’t 1, as well as its reciprocal, and divide them
  4. Then run this function row-wise on the input

Actually building up that function took ~20 minutes.  I felt confident the approach would work so didn’t stop to consider anything else… I’m excited to see other solutions after I publish this, as maybe there’s something elegant I missed.

Along the way I learned: is.integer doesn’t do what I thought it would.  Come on, base R.

I don’t work with matrices much (not a mathematician, don’t have big data) and was a somewhat vexed by the matrix -> data.frame conversion.


Advent of Code 2017 in #rstats: Day 1

Today’s puzzle is a good example of thinking “R-ishly”.   In R, I find it easier to compare vectors than to compare strings, and easier to work with vectorized functions than to loop.  So my code starts by splitting the input into a vector.

Part 1:

Split the input into a vector, add the first value to the end, and use dplyr’s lead() function to compare each value to the following value:

Part 2:

This challenge is simpler, in my opinion.  You can halve the vector, then compare the first half to the second half, summing the matches (don’t forget to double that result).

AABG Knob Creek Barrel Project

In December 2014, a friend of a friend acquired a 53 gallon barrel that had previously held Knob Creek Single Barrel Reserve whiskey for 9 years.  It made its way from Kentucky to Ann Arbor and now lives in my basement.

Staining = spilled beer

Since then we’ve rotated beers through it.  In order of fill date:

  • Imperial Stout
  • Scotch Ale (this beer naturally soured)
  • Oud Bruin (we pitched 8 packs of Blackman Flemish Sour Mix)
  • Tart of Darkness Stout (here we introduced Brett C., actually a strain of Brett Anomalous)
  • Dark Saison
  • Belgian Golden Strong
  • IPA

We empty + refill every six months or so.  The brewers are a rotating cast, with people dropping in and out.  We typically aim to bring 11 shares of 5 gallons each, filling the barrel to the top and leaving some extra to top up the angel’s share.

This barrel has produced consistently good beers, and at this point the sour character is locked in.  Beers from this barrel have won silver and gold medals in the American Wild Ale category at the 2016 & 2017 Michigan Beer Cup.  Brewers often perform a tertiary fermentation on fruit – tart cherries are a favorite, this being Michigan – and sometimes blend with young or clean beers to cut sourness to taste.

How much sorbate and sulfite should you add to stabilize cider?

I re-researched this every fall when it came time to backsweeten the previous year’s cider, so I wrote this guide to future me.

If you add sugar to hard cider and don’t want that addition to restart fermentation (which would increase alcohol and leave the cider even drier), you’ll need to stabilize it.  The most common method in home cidermaking is to add both potassium sorbate and potassium metabisulfite (“K-Meta”).  This guidance from BYO magazine on backsweetening provides background on the approach.


For each gallon of cider, use 1/2 tsp of potassium sorbate and 1/2 tsp of 10% sulfite solution (an extra step, but worth making – the solution is easier to work with than dry potassium metabisulfite).

Longer version

How much potassium sorbate?

Winemakers say…

Winemakers talk more about sorbic acid, the relevant chemical; potassium sorbate is 74% sorbic acid.  There are legal limits of 0.2 g/L (Europe) and 0.3 g/L (America); the sensory level for perceiving this chemical’s flavor is reported at 0.135 g/L.

Adjusting these from sorbic acid -> potassium sorbate (what a homebrewer weighs) gives legal limits of 0.26 g/L and 0.4 g/L, respectively, with a taste threshold of 0.18 g/L.

Continue reading How much sorbate and sulfite should you add to stabilize cider?

Ride Your Bike In Traffic and Live Longer

Summary: Your life expectancy is higher if you get in traffic on a bike instead of in a car.  Biking alongside cars might seem dangerous – and this misconception may deter potential cyclists or lead them to risky behavior like riding on the sidewalk – but the health benefits greatly exceed the dangers of crashes and other risks.


Last week, The Ann (an Ann Arbor magazine) showcased a story by a local NPR station about bikes and cars co-existing on the road.  The Ann added their own more-provocative title: “Who owns the road: drivers or cyclists?”

Their framing succeeded in drumming up conflict-oriented comments from readers.  Reading the comments, I was struck by two things:

Continue reading Ride Your Bike In Traffic and Live Longer

How to Teach Yourself R

(Or, “how to teach professionals to teach themselves R”).

Background: I taught myself R in 2014 from public web resources, and since then have steered several cohorts of data analysts at my organization through various R curricula, adapting based on their feedback.

This is geared toward people teaching themselves R outside of graduate school (I perceive graduate students to have more built-in applications and more time for learning, though I don’t speak from experience).  I say “students” below but I am referring to professionals.  This advice assumes little or no programming experience in other languages, e.g., people making the shift from Excel to R (I maintain that Excel is one of R’s chief competitors).  If you already work in say, Stata, you may face fewer frustrations (and might consider DataCamp’s modules geared specifically to folks in your situation). 

I’ve tried combinations of Coursera’s Data Science Specialization, DataCamp’s R courses, and the “R for Data Science” textbook.  Here’s what I’ve learned about learning and teaching R and what I recommend.

I see three big things that will help you learn R:

  1. A problem you really want to solve
  2. A self-study resource
  3. A coach/community to help you

Continue reading How to Teach Yourself R

Batch 73: Session Mild

This was simple: the second runnings from Batch 72.  The goal was two-fold:

  1. Have a light, approachable beer on tap for guests who drink “regular” beer
  2. A freebie: extra beer for little effort

Brewed March 24th, OG was ~1.036.  We threw in a partial ounce of random hops for bittering and used S-O4 dry yeast for low attenuation.

By April 7th the FG was 1.013 and I kegged it.  Roughly 3.0% ABV.

I served the beer from my cellar, at around 60 degrees, undercarbonated.  It was a little thin, though great for blending with other beers on tap.  For instance, blending it about 9:1 with my overly-sweet Belgian Dark Strong (~12%) on tap made for a highly drinkable session beer, leaving it slightly below 4% abv.

Like all of my second runnings beers, this keg blew way before the main batch – in this case, before the Imperial Stout was even packaged.

Batch 72: Frank’s Imperial Stout

Having my brother in town as a helper, we decided to brew a partigyle beer: 11 gallons of Imperial Stout and a 2nd-runnings Mild.  I used the same recipe I came up with for the first beer in the Knob Creek barrel.  That beer was outstanding after blending with 10 other people’s beer and barrel-aging; as I recall, mine was pretty good going into the barrel, too.

The recipe was a mix of a few credible recipes.

Continue reading Batch 72: Frank’s Imperial Stout