N_distinct - точный расчет с дисковыми фреймами?
Я запускаю n_distinct для большого файла (>30 ГБ), и, похоже, он не дает точного результата.
У меня есть еще одна контрольная точка для данных, а вывод в агрегате фреймов диска отключен.
В документации упоминается, что n_distinct - это точный расчет, а не оценка.
Это правильно?
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
по результату всех собранных кусков.
Но я не могу исключить, есть ли ошибка где-то еще.
У вас есть тестовые примеры, чтобы показать, что это не совсем так? Может быть, вы можете внести свой PR для тестирования?