Является ли n_distinct точным вычислением с дисковыми фреймами?

#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 по результату всех однажды собранных блоков.

Но я не могу исключить, есть ли ошибка в другом месте.

У вас есть тестовые примеры, чтобы показать, что это не совсем так? Возможно, вы можете внести свой вклад в пиар-тест?