Let just add that data.frame is dropping by default and tibble is not.
However you can use drop = TRUE if you really need to get numeric and not a tibble.
library(tibble)
mtcars_tibble <- as_tibble(mtcars)
class(mtcars_tibble[1,2, drop = TRUE])
#> [1] "numeric"
In tidyverse, pull is here to extract what is inside a tibble and would be the best pratice.
See
?`[`
and
?tibble::`[.tbl_df`