Thanks! I was hoping for a general solution (or at least one that would be capable of creating a total for numerical values) but yes, unite does the paste bit, and does it well (including a separator).
It will likely not do for computing a sum of numeric columns, but for the use case described it is spot on.
For the benefit of posterity a comparison of base R and tidyverse approaches:
library(tidyverse)
animals <- data.frame(cats = letters[1:10],
dogs = letters[1:10],
catepillars = rev(letters[1:10]),
stringsAsFactors = F)
# base R solution
animals$base <- do.call(paste, animals[,grepl("cat", names(animals))])
# dplyr solution
animals <- animals %>%
unite(dplyr, starts_with("cat"), remove = F, sep = " ")
# just print the stuff...
animals
dplyr cats dogs catepillars base
1 a j a a j a j
2 b i b b i b i
3 c h c c h c h
4 d g d d g d g
5 e f e e f e f
6 f e f f e f e
7 g d g g d g d
8 h c h h c h c
9 i b i i b i b
10 j a j j a j a