【R語言】合併行操作中data.frame與data.table的效能比較
阿新 • • 發佈:2018-12-26
測試案例說明
- 總資料量為M*N條。平均的分佈在N個data.frame/data.table變數中,每個變數為M行。
- 這N個變數儲存在list中,以1:N表示。list(data.frame)與list(data.table)。
- 將N個變數合併成一個。
- N個變數資料格式一致。
- 若耗時處於同一量級或比較接近,如11.8,12.8,13.4等,視為同一水平,用同一資料表示。
- 用df表示data.frame。
- 用dt表示data.table。
- 無特殊說明,均為100次迴圈操作的結果。時間為平均耗時。
- 測試平臺資訊:【cpu】i7-4770。【記憶體】32G DDR3。
- 環境:【R】3.5.1【data.table】1.11.4【dplyr】 0.7.6
操作結果1
說明:
- N=20,M=30。總據資料為6000條左右。ncol=11。
操作組合 | 耗時 | 說明 | |
---|---|---|---|
1 | data.frame + base::rbind | 110ms左右) | 這個應該是大部分人的常用組合 |
1 | data.table + base::rbind | 13ms左右 | |
2 | data.frame + dplyr::rbind | 13ms左右 | |
3 | data.table + dplyr::rbind | 13ms左右 | |
3 | data.frame + data.table::rbindlist | 0.132ms左右 | |
3 | data.table + data.table::rbindlist | 0.139ms左右 | |
4 | data.frame + dplyr::rbind_list | 1.15ms左右 | |
4 | data.table + dplyr::rbind_list | 1.57ms左右 |
操作結果2
說明:
- M=40000。總據資料為40000*N條左右。ncol=25。
操作組合 | 耗時 | 說明 | |
---|---|---|---|
1 | data.frame + base::rbind | 659ms左右) | N=10。這個應該是大部分人的常用組合 |
1 | data.table + base::rbind | 140ms左右 | N=10 |
2 | data.frame + dplyr::rbind | 318ms左右 | N=10 |
3 | data.table + dplyr::rbind | 331ms左右 | N=10 |
3 | data.frame + data.table::rbindlist | 33ms左右 | N=100 |
3 | data.table + data.table::rbindlist | 339ms左右 | N=100 |
4 | data.frame + dplyr::rbind_list | 67ms左右 | N=100 |
4 | data.table + dplyr::rbind_list | 670ms左右 | N=100 |
結論
- 在該場景中,對list資料的合併,使用rbind系列函式比簡單的使用for效果強很多。
- df+rbind的組合在這次測試中基本墊底。所以如沒有特殊需求,還是忘記它吧。
- 當資料量特別大,N=100時,dt的優勢好像沒有了,這裡我很看不懂。正常來說,資料量越大,dt的優勢越大才對。有人知道的話,也請指教。
- 其實針對list結構,還有rlist包的list.rbind可以用,不過效能沒有上面的好,勝在對list結構的擴充套件操作比較多。