In the R base, you can use sapply() to create an atomic vector of minimal columns, and then rbind() to attach it to the original data. I added NA for the first value, since we need something there to add it to the source data.
rbind(df, c(NA, sapply(df[2:8], min, na.rm = TRUE)))
Obviously, this assumes only 8 columns, and therefore df[-1] can be used instead of df[2:8] .
And to increase speed, we can use vapply() over sapply() , because we know that the result will be a single numerical value.
rbind(df, c(NA, vapply(df[-1], min, 1, na.rm = TRUE)))
Update: In response to your comment on another answer - to get "MIN" in the first column and the minimum values โโin all the rest, we can configure the call to the named list and do it all at once. Thus, we do not mix column classes (character and number) and end with unexpected classes in the columns of the resulting data.
rbind( df, c(setNames(list("MIN"), names(df)[1]), lapply(df[-1], min, na.rm = TRUE)) )
source share