data.table
больше подходит для объемных данных, чем dplyr
. Операции будут быстрее и потребуют меньше оперативной памяти, если вы примените соответствующий глагол data.table
, особенно оператор :=
. Если вы не знакомы с data.table
, я рекомендую вам виньетки пакета.
Решение об отказе от использования crossing̀
исходит из этой нити . Не уверен, что я правильно понял ключ слияния: я думаю, что вам нужны только комбинации track_id
с одинаковыми значениями слева и справа (потому что вы делаете filter(track_id != track_id2)
в своем коде), но дайте мне больше подробностей, если это не так , Чтобы выбрать топ n наблюдений с помощью data.table
, вы должны использовать dist1[,head(.SD, 100),by = "track_id2"]
. Я могу предложить вам следующий код, который может нуждаться в некоторой адаптации, поскольку он не проверен без воспроизводимого примера.
library(data.table)
setDT(dist1)
setnames(dist1,
old = c("track_id", "artist_familiarity","artist_hotttnesss","loudness"),
new = c("track_id2","artist_fam", "artist_hot", "loud"))
dist1[,as.list(dist1),by="track_id"]
dist1[, dist_inv1 := 1 / ((artist_fam - artist_familiarity)^2 +
(artist_hot - artist_hotttnesss)^2 + (loud - loudness)^2)^.5]
dist_agg <- dist1[,head(.SD, 100),by = "track_id2"]
dist_agg <- dist_agg[,.SD,.SDcols = c("track_id2", "track_id", "dist_inv")]
dist_agg[,dist := 1/dist_inv]
dist_agg <- dist_agg[order(track_id2, dist)]