Your overall strategy is to group the data by species and then use evaluate the min and max separately for each group. This can be done in the following manner:
library(dplyr)
df <-
structure(
list(species = c("salt cedar", "salt cedar", "cheatgrass", "cheatgrass"),
temp_min = c(0L, -5L, -24L, 3L),
temp_max = c(35L, 20L, 15L, 33L)),
.Names = c("species", "temp_min", "temp_max"),
class = "data.frame",
row.names = c(NA, -4L))
df %>%
group_by(species) %>%
summarise(temp_min = min(temp_min),
temp_max = max(temp_max))
You may find the materials at http://r4ds.had.co.nz/transform.html helpful.