Ordering data.frames elegantly by factor
I think the task you are attempting to accomplish (obtain indices to reorder a data frame by several factors, one after another) is already handled well by the built-in order function. Let's consider your sample data:

order(mock_Data$Clinical)
# [1] 1 3 5 7 8 2 4 6 9


As you can see, order is returning row numbers instead of row names; this yields an identical reordered data frame:

identical(mock_Data[reorder_by_factor(mock_Data, mock_Data$Clinical),],
          mock_Data[order(mock_Data$Clinical),])
# [1] TRUE


There are several other advantages of using the built-in order function:


It already smoothly handles reordering by multiple factors, one after another
It can reorder by a mix of factor and numeric variables
It is already implemented and distributed with base R, so you don't need to develop and test your own version of this function


Another advantage is that the built-in order function is more efficient than your implementation. Let's see on a resampled version of your dataset with 1 million rows:

set.seed(144)
big.dat &lt;- mock_Data[sample(seq_len(nrow(mock_Data)), 1e6, replace=T),]
library(microbenchmark)
microbenchmark(reorder_by_factor(big.dat, big.dat$Clinical), order(big.dat$Clinical))
# Unit: milliseconds
#                                          expr      min       lq     mean   median        uq       max neval
#  reorder_by_factor(big.dat, big.dat$Clinical) 562.2527 744.4318 939.0831 898.6288 1054.0008 1678.1246   100
#                       order(big.dat$Clinical) 149.4750 153.2963 199.8178 160.5452  225.9082  459.5558   100


The built-in function runs about 5x faster.