1. 程式人生 > >【R語言】合併行操作中data.frame與data.table的效能比較

【R語言】合併行操作中data.frame與data.table的效能比較

測試案例說明

  1. 總資料量為M*N條。平均的分佈在N個data.frame/data.table變數中,每個變數為M行。
  2. 這N個變數儲存在list中,以1:N表示。list(data.frame)與list(data.table)。
  3. 將N個變數合併成一個。
  4. N個變數資料格式一致。
  5. 若耗時處於同一量級或比較接近,如11.8,12.8,13.4等,視為同一水平,用同一資料表示。
  6. 用df表示data.frame。
  7. 用dt表示data.table。
  8. 無特殊說明,均為100次迴圈操作的結果。時間為平均耗時。
  9. 測試平臺資訊:【cpu】i7-4770。【記憶體】32G DDR3。
  10. 環境:【R】3.5.1【data.table】1.11.4【dplyr】 0.7.6

操作結果1

說明:

  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

說明:

  1. 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

結論

  1. 在該場景中,對list資料的合併,使用rbind系列函式比簡單的使用for效果強很多。
  2. df+rbind的組合在這次測試中基本墊底。所以如沒有特殊需求,還是忘記它吧。
  3. 當資料量特別大,N=100時,dt的優勢好像沒有了,這裡我很看不懂。正常來說,資料量越大,dt的優勢越大才對。有人知道的話,也請指教。
  4. 其實針對list結構,還有rlist包的list.rbind可以用,不過效能沒有上面的好,勝在對list結構的擴充套件操作比較多。