У меня возникает следующая проблема при попытке выполнить следующий анализ с большими данными:
У меня есть два фрейма данных 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