Быстрее unique () для сравнения ключей в двух фреймах данных - PullRequest
0 голосов
/ 12 марта 2019

У меня возникает следующая проблема при попытке выполнить следующий анализ с большими данными:

У меня есть два фрейма данных A и B с одним и тем же первичным ключом (в нескольких столбцах), но фрейм данных A имеетдобавление к нему переменной даты.

Теперь я хочу проверить, есть ли для всех уникальных объектов в кадре данных A запись в кадре данных B.Я делаю это с помощью следующей функции:

checkMissing <- function(A, B, primary_key) {
  A <- unique(A[,primary_key])
  B <- unique(B[,primary_key])
  return(A[!A %in% B,])
}

Как выясняется, уникальная часть ужасно медленная, когда A получает все больше и больше данных (я проверил что-то вроде 15MN строк, и это заняло около 30 секундна моей машине).

Есть ли более умный способ проверить, отсутствуют ли объекты в B, без использования dplyr?(база R была бы идеальной, но data.table также работает)

Вот воспроизводимый пример:

library(tictoc)
checkMissing <- function(A, B, primary_key) {
  tic("making data unique")
  A <- unique(A[,primary_key])
  B <- unique(B[,primary_key])
  toc()
  return(A[!A %in% B,])
}
# creating the dummy key data

ID1 <- 250000
ID2 <- seq(1,ID1/100,1)
ID3 <- seq(1,ID1/10000,1)

tmp <- data.frame("ID1" = seq(1,ID1,1),
                  "ID2" = sample(ID2, ID1, replace = TRUE),
                  "ID3" = sample(ID3, ID1, replace = TRUE)
)

#creating the date sequence
dates <- data.frame("date" = seq.Date(as.Date("2019-01-01"),as.Date("2019-02-28"),1))

#cross join to get data frame A
df.A <- merge(dates,tmp,by=NULL)

# create data frame B
df.B <- unique(df.A[,c("ID1","ID2","ID3")])

tic("overall time")
df.result <- checkMissing(df.A,df.B,c("ID1","ID2","ID3"))
toc()

Спасибо!Stephan

1 Ответ

0 голосов
/ 13 марта 2019

, как отметил в своем комментарии Джоран, - реализация анти объединения в data.table намного быстрее:

setDT(df.A)[!df.B, on = c("ID1","ID2","ID3")]

В моем тесте выполнение данных сократилось с 30-35 секунд до менее 2 секунд.

Хотя все еще заинтересован в более быстрой версии Base R, это правильный ответ.

Лучший Стефан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...