Вариант 1:
Через соединение с файлом count.fields()
подсчитывает количество полей в строке файла на основе некоторого значения sep
(что нам здесь неинтересно). Поэтому, если мы возьмем длину этого результата, теоретически мы должны указать количество строк (и строк) в файле.
length(count.fields(filename))
Если у вас есть строка заголовка, вы можете пропустить ее с помощью skip = 1
length(count.fields(filename, skip = 1))
Существуют и другие аргументы, которые вы можете настроить для своих конкретных потребностей, например пропустить пустые строки.
args(count.fields)
# function (file, sep = "", quote = "\"'", skip = 0, blank.lines.skip = TRUE,
# comment.char = "#")
# NULL
Подробнее см. help(count.fields)
.
Не так уж плохо, насколько скорость идет. Я тестировал его на одном из моих файлов бейсбола, который содержит 99846 строк.
nrow(data.table::fread("Batting.csv"))
# [1] 99846
system.time({ l <- length(count.fields("Batting.csv", skip = 1)) })
# user system elapsed
# 0.528 0.000 0.503
l
# [1] 99846
file.info("Batting.csv")$size
# [1] 6153740
Вариант 2: Еще одна идея - использовать data.table::fread()
для чтения только первого столбца, а затем взять количество строк. Это было бы очень быстро.
system.time(nrow(fread("Batting.csv", select = 1L)))
# user system elapsed
# 0.063 0.000 0.063