It doesn't per se misread the column types - It will look at the first 1,000 entries and then based on that make an educated guess as to the type of the column. If you after the first 1,000 entries somehow have an entry, which defines the column type to be different than the first 1,000 then you can get some quirky behaviour. Take a look at n_max, which can be used to fix issues:
> ?read_csv
read_csv(file, col_names = TRUE, col_types = NULL,
locale = default_locale(), na = c("", "NA"), quoted_na = TRUE,
quote = "\"", comment = "", trim_ws = TRUE, skip = 0, n_max = Inf,
guess_max = min(1000, n_max), progress = show_progress())```