#r #disk.frame
#r #диск.рамка #disk.frame
Вопрос:
Я запускаю n_distinct для большого файла (> 30 ГБ), и, похоже, он не дает точного результата.
У меня есть другая точка отсчета для данных, и вывод отключен в совокупности дисковых фреймов.
В документах упоминается, что n_distinct — это точный расчет, а не оценка.
Это правильно?
Комментарии:
1. На довольно краткой странице справки упоминается, что
n_unique
это более быстрая версияlength(unique(x))
.2. Я не знаком с disk.frame, возможно ли, что вы вычисляете
n_distinct
для каждого фрагмента, так что, если значение появляется в разных фрагментах, оно подсчитывается несколько раз?3. Я понимаю, что он различает каждый фрагмент, а затем различает полный список
Ответ №1:
Реализацию n_distinct
можно найти на этой странице https://github.com/xiaodaigh/disk.frame/blob/master/R/one-stage-verbs.R
#' @export
#' @rdname one-stage-group-by-verbs
n_distinct_df.chunk_agg.disk.frame <- function(x, na.rm = FALSE, ...) {
if(na.rm) {
setdiff(unique(x), NA)
} else {
unique(x)
}
}
#' @export
#' @importFrom dplyr n_distinct
#' @rdname one-stage-group-by-verbs
n_distinct_df.collected_agg.disk.frame <- function(listx, ...) {
n_distinct(unlist(listx))
}
Теперь, похоже, это точный расчет, как я и предполагал. Логика проста, она вычисляет unique
внутри каждого блока, а затем n_distinct
по результату всех однажды собранных блоков.
Но я не могу исключить, есть ли ошибка в другом месте.
У вас есть тестовые примеры, чтобы показать, что это не совсем так? Возможно, вы можете внести свой вклад в пиар-тест?