我試圖根據兩個條件將兩個數據集合併到R中。他們必須有相同的ID和年份。其中一個載體具有約10000大小和其他2000年我想,如果我做一個二級逐一搜索,計算時間會爆炸。數據按id和年份排序。有沒有比天真的比較更有效的搜索算法?是否有更高效的搜索算法
回答
該問題有很多解決方案,例如,通過合併,索引,循環(如你所說)。
但是,最優雅的解決方案是使用data.table
程序包,該程序包管理數據集的速度非常快,可以認爲是data.frame
的演變版本。
讓我們先設置數據:根據您在問題中提供的有限信息,下面是解決該問題的虛擬嘗試。
install.packages("data.table")
library(data.table)
set.seed(100)
dt1 <- data.table(
id = 1:10000,
Year = sample(1950:2014,size=10000,replace = TRUE),
v1 = runif(10000)
)
head(dt1)
dt2 <- data.table(
id = sample(1:10000,2000),
Year = sample(1950:2014,size=2000,replace = TRUE),
v2 = runif(2000),
v3 = runif(2000)
)
head(dt2)
數據一旦建立,其餘部分就非常簡單。
第1步:設置密鑰。
setkey(dt1,id,Year) # Set keys in first table
setkey(dt2,id,Year) # Set keys in second table
第2步:合併你想要的任何方式。
dt1[dt2,nomatch=0]
dt2[dt1,nomatch=0]
合併數據所用的時間約爲0.02秒。這對於非常大的數據集也非常快速。
system.time(dt1[dt2,nomatch=0]) # 0.02 sec
system.time(dt2[dt1,nomatch=0]) # 0.02 sec
要了解更多關於data.table
?example(data.table)
希望這有助於!
如果不是這樣,PLZ發佈更多細節!
感謝您提及data.table包。我發現這個介紹data.frame helpfu。顯然,data.table使用二進制搜索而不是矢量掃描。所以速度要快得多。 [鏈接](http://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.pdf) –
完全正確。還有另外兩個不錯的閱讀。試試:'vignette(「datatable-faq」)'和 'vignette(「datatable-timing」)' – Shambho
@YanSong,[this answer](http://stackoverflow.com/a/20057411/559784)可能有助於回答一些關於'data.table'和二進制搜索的問題。 – Arun
- 1. 高效的重複搜索算法
- 2. 是否有更高效的算法來壓扁數組?
- 3. 有效的多搜索算法
- 4. 更有效的方法來做這個搜索算法?
- 5. 更高效的compareTo算法?
- 6. 什麼是更高效?模糊搜索或範圍搜索?
- 7. 歐拉項目#8:是否有比蠻力計算更高效的算法?
- 8. 是否有比二分搜索中點更有效的搜索因子?
- 9. 是否有索引結構(數據結構)或算法可以高效快速地執行鄰近搜索?
- 10. 是否有匹配短語的搜索算法/方法?
- 11. 使我的字典搜索更高效
- 12. 高效的多維數組的搜索算法實現在PHP
- 13. PHP,MySQL,高效的標籤驅動搜索算法
- 14. 捕獲文件的高效搜索算法
- 15. 在Java中搜索和排序算法的高效實現
- 16. 需要幫助構建高效的窮舉搜索算法
- 17. 是否有更高效的Java 8 Stream方法來查找int []中的索引?
- 18. 需要幫助以更高效的方式爲搜索算法設計
- 19. 更高效地搜索文本文件
- 20. Memcache db模型使搜索更高效
- 21. 索引映射的高效算法
- 22. 搜索/排序算法 - 是否有類似GoF的房源?
- 23. 高效的詞典搜索?
- 24. 高效的MySQL搜索
- 25. 高效的MySQL搜索
- 26. 算法 - 如何高效連接兩個二叉搜索樹?
- 27. 如何高效地搜索文件系統(算法)?
- 28. 有沒有更高效的方法來做這個算法?
- 29. 是否有更高效的方法來執行此SQL選擇?
- 30. 二進制搜索方法需要更加高效的
的數據進行排序? – Fernando
是的。它按照id和年份排序。我編輯了這個問題。 –
需要注意的是10K和2K是計算機數量相對較少。所以,這裏「爆炸」意味着......大約1ms或者什麼東西(當然是非常相對的,但你明白我的觀點)?由於它已排序,所以當事物不匹配時可以跳過。 – keyser