R return the index of the minimum column for each row

Another option is max.col of d multiplied by -1

max.col(-d)
# [1] 1 4 3 3 1 1 2 2 4 4 1 3 1 1 3 3 2 3 2 4

If you need a matrix as output, use

cbind(1:nrow(d),    # row
      max.col(-d))  # column position of minimum

Here is a benchmark of the two approaches

set.seed(42)
dd <- as.data.frame(matrix(runif(1e5 * 100), nrow = 1e5, ncol = 100))

library(microbenchmark)
library(ggplot2)

b <- microbenchmark(
  apply = apply(dd, 1, which.min),
  max_col = max.col(-dd),
  times = 25
)

autoplot(b)

enter image description here

b
#Unit: milliseconds
#    expr      min       lq     mean   median       uq       max neval cld
#   apply 705.7478 855.7112 906.2340 892.3214 933.4655 1211.5016    25   b
# max_col 162.8273 175.6363 227.1156 206.0213 225.2973  406.9124    25  a 

Your English description suggests you want:

 apply( df, 1, which.min)

But the answer you give is not formatted as a vector and is not the correct answer if the above interpretation is correct. Oh wait, you were expecting rownumbers.

 as.matrix(apply( d, 1, which.min))

   [,1]
1     1
2     4
3     3
4     3
5     1
6     1
7     2
8     2
9     4
10    4
11    1
12    3
13    1
14    1
15    3
16    3
17    2
18    3
19    2
20    4