使用 R 提升您的數據處理能力
已發表: 2022-03-11R 語言通常被認為是統計學家和數據科學家的語言。 很久以前,這基本上是真的。 然而,多年來,R 通過包提供的靈活性使 R 成為一種更通用的語言。 R 於 1995 年開源,從那時起 R 包的存儲庫不斷增長。 儘管如此,與 Python 等語言相比,R 還是基於數據的。
說到數據,表格數據值得特別關注,因為它是最常用的數據類型之一。 它是一種數據類型,對應於數據庫中已知的表結構,其中每一列可以是不同的類型,並且該特定數據類型的處理性能是許多應用程序的關鍵因素。
在本文中,我們將介紹如何以有效的方式實現表格數據轉換。 許多已經將 R 用於機器學習的人並不知道在 R 中可以更快地完成數據處理,並且他們不需要使用其他工具來實現它。
R 中的高性能解決方案
Base R 在 1997 年推出了基於 S-PLUS 的data.frame
類。 與常用的逐行存儲數據的數據庫不同,R data.frame
將數據作為面向列的結構存儲在內存中,因此對於分析中常見的列操作而言,它的緩存效率更高。 此外,即使 R 是一種函數式編程語言,它也不會強制開發人員這樣做。 data.table
R 包很好地解決了這兩個機會,該包可在 CRAN 存儲庫中找到。 它在分組操作時執行得非常快,並且通過注意實現中間數據子集(例如僅實現特定任務所需的那些列)來特別節省內存。 在添加或更新列時,它還通過其引用語義避免了不必要的複制。 該軟件包的第一個版本已於 2006 年 4 月發布,顯著提高了當時的data.frame
性能。 最初的包描述是:
這個包做的很少。 它存在的唯一原因是白皮書指定 data.frame 必須有行名。 這個包定義了一個新的類data.table,它的操作就像一個data.frame,但使用的內存少了10倍,創建(和復制)的速度提高了10倍。 它還藉此機會允許在 [] 中使用子集()和 with()之類的表達式。 大部分代碼都是從基本函數中復制的,刪除了操作 row.names 的代碼。
從那時起, data.frame
和data.table
實現都得到了改進,但data.table
仍然比 base R 快得令人難以置信。事實上, data.table
不僅比 base R 快,而且似乎是其中之一最快的開源數據整理工具,與 Python Pandas 等工具、列式存儲數據庫或 Spark 等大數據應用程序競爭。 它在分佈式共享基礎設施上的性能尚未進行基準測試,但能夠在單個實例上擁有多達 20 億行的數據具有廣闊的前景。 出色的性能與功能齊頭並進。 此外,隨著最近為提高性能而對耗時的部分進行並行化的努力,推動性能極限的一個方向似乎很明確。
數據轉換示例
學習 R 變得容易一點,因為它是交互式工作的,所以我們可以一步一步地跟著例子,隨時查看每一步的結果。 在開始之前,讓我們從 CRAN 存儲庫安裝data.table
包。
install.packages("data.table")
有用的提示:我們可以打開任何功能的手冊,只需輸入帶有問號的名稱,即?install.packages
。
將數據加載到 R
有大量用於從各種格式和數據庫中提取數據的包,其中通常包括本機驅動程序。 我們將從CSV文件加載數據,這是原始表格數據最常見的格式。 可以在此處找到以下示例中使用的文件。 我們不必擔心CSV
讀取性能,因為fread
函數在此基礎上進行了高度優化。
為了使用包中的任何函數,我們需要通過library
調用來加載它。
library(data.table) DT <- fread("flights14.csv") print(DT)
## year month day dep_delay arr_delay carrier origin dest air_time ## 1: 2014 1 1 14 13 AA JFK LAX 359 ## 2: 2014 1 1 -3 13 AA JFK LAX 363 ## 3: 2014 1 1 2 9 AA JFK LAX 351 ## 4: 2014 1 1 -8 -26 AA LGA PBI 157 ## 5: 2014 1 1 2 1 AA JFK LAX 350 ## --- ## 253312: 2014 10 31 1 -30 UA LGA IAH 201 ## 253313: 2014 10 31 -5 -14 UA EWR IAH 189 ## 253314: 2014 10 31 -8 16 MQ LGA RDU 83 ## 253315: 2014 10 31 -4 15 MQ LGA DTW 75 ## 253316: 2014 10 31 -5 1 MQ LGA SDF 110 ## distance hour ## 1: 2475 9 ## 2: 2475 11 ## 3: 2475 19 ## 4: 1035 7 ## 5: 2475 13 ## --- ## 253312: 1416 14 ## 253313: 1400 8 ## 253314: 431 11 ## 253315: 502 11 ## 253316: 659 8
如果我們的數據沒有很好地建模以進行進一步處理,因為它們需要從 long-to-wide 或 wide-to-long(也稱為pivot和unpivot )格式重新整形,我們可以查看?dcast
和?melt
函數,從 reshape2 包中知道。 但是, data.table
為 data.table/data.frame 類實現了更快且內存效率更高的方法。
使用data.table
語法查詢
如果您熟悉data.frame
查詢data.table
與查詢data.frame
非常相似。 在i
參數中進行過濾時,我們可以直接使用列名,而無需使用$
符號訪問它們,例如df[df$col > 1, ]
。 當提供下一個參數j
時,我們提供了一個要在data.table
範圍內評估的表達式。 要傳遞非表達式j
參數,請使用with=FALSE
。 第三個參數,不存在於data.frame
方法中,定義了組,使j
中的表達式由組評估。
# data.frame DF[DF$col1 > 1L, c("col2", "col3")] # data.table DT[col1 > 1L, .(col2, col3), ...] # by group using: `by = col4`
如果您熟悉數據庫
查詢data.table
在很多方面都對應著更多人可能熟悉的SQL查詢。 下面的DT
代表data.table
對象,對應 SQL 的FROM
子句。
DT[ i = where, j = select | update, by = group by] [ having, ... ] [ order by, ... ] [ ... ] ... [ ... ]
排序行和重新排序列
數據排序是時間序列的關鍵轉換,也是數據提取和呈現的導入。 排序可以通過向i
參數提供行順序的整數向量來實現,方法與data.frame
相同。 查詢order(carrier, -dep_delay)
中的第一個參數將在carrier
字段上按升序選擇數據,在dep_delay
度量上按降序選擇數據。 第二個參數j
,如上一節所述,定義要返回的列(或表達式)及其順序。
ans <- DT[order(carrier, -dep_delay), .(carrier, origin, dest, dep_delay)] head(ans)
## carrier origin dest dep_delay ## 1: AA EWR DFW 1498 ## 2: AA JFK BOS 1241 ## 3: AA EWR DFW 1071 ## 4: AA EWR DFW 1056 ## 5: AA EWR DFW 1022 ## 6: AA EWR DFW 989
要通過引用重新排序數據,而不是按特定順序查詢數據,我們使用set*
函數。
setorder(DT, carrier, -dep_delay) leading.cols <- c("carrier","dep_delay") setcolorder(DT, c(leading.cols, setdiff(names(DT), leading.cols))) print(DT)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1241 2014 4 15 1223 JFK BOS 39 ## 3: AA 1071 2014 6 13 1064 EWR DFW 175 ## 4: AA 1056 2014 9 12 1115 EWR DFW 198 ## 5: AA 1022 2014 6 16 1073 EWR DFW 178 ## --- ## 253312: WN -12 2014 3 9 -21 LGA BNA 115 ## 253313: WN -13 2014 3 10 -18 EWR MDW 112 ## 253314: WN -13 2014 5 17 -30 LGA HOU 202 ## 253315: WN -13 2014 6 15 10 LGA MKE 101 ## 253316: WN -13 2014 8 19 -30 LGA CAK 63 ## distance hour ## 1: 1372 7 ## 2: 187 13 ## 3: 1372 10 ## 4: 1372 6 ## 5: 1372 7 ## --- ## 253312: 764 16 ## 253313: 711 20 ## 253314: 1428 17 ## 253315: 738 20 ## 253316: 397 16
大多數情況下,我們不需要原始數據集和有序/排序數據集。 默認情況下,與其他函數式編程語言類似,R 語言會將排序後的數據作為新對象返回,因此需要的內存是按引用排序的兩倍。
子集查詢
讓我們為航班出發地“JFK”和從 6 到 9 的月份創建一個子集數據集。在第二個參數中,我們將結果子集到列出的列中,添加一個計算變量sum_delay
。
ans <- DT[origin == "JFK" & month %in% 6:9, .(origin, month, arr_delay, dep_delay, sum_delay = arr_delay + dep_delay)] head(ans)
## origin month arr_delay dep_delay sum_delay ## 1: JFK 7 925 926 1851 ## 2: JFK 8 727 772 1499 ## 3: JFK 6 466 451 917 ## 4: JFK 7 414 450 864 ## 5: JFK 6 411 442 853 ## 6: JFK 6 333 343 676
默認情況下,當在單列data.table
上設置數據集時,會自動為該列創建索引。 這會導致對該列的任何進一步過濾調用的實時答案。
更新數據集
通過引用添加新列是使用:=
運算符執行的,它將變量分配到數據集中。 這避免了數據集的內存副本,因此我們不需要將結果分配給每個新變量。
DT[, sum_delay := arr_delay + dep_delay] head(DT)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1241 2014 4 15 1223 JFK BOS 39 ## 3: AA 1071 2014 6 13 1064 EWR DFW 175 ## 4: AA 1056 2014 9 12 1115 EWR DFW 198 ## 5: AA 1022 2014 6 16 1073 EWR DFW 178 ## 6: AA 989 2014 6 11 991 EWR DFW 194 ## distance hour sum_delay ## 1: 1372 7 2992 ## 2: 187 13 2464 ## 3: 1372 10 2135 ## 4: 1372 6 2171 ## 5: 1372 7 2095 ## 6: 1372 11 1980
要一次添加更多變量,我們可以使用DT[,
:= (sum_delay = arr_delay + dep_delay)]
語法,類似於從數據集查詢時的.(sum_delay = arr_delay + dep_delay)
。
可以通過引用進行子分配,僅通過與i
參數組合來更新特定的行。
DT[origin=="JFK", distance := NA] head(DT)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1241 2014 4 15 1223 JFK BOS 39 ## 3: AA 1071 2014 6 13 1064 EWR DFW 175 ## 4: AA 1056 2014 9 12 1115 EWR DFW 198 ## 5: AA 1022 2014 6 16 1073 EWR DFW 178 ## 6: AA 989 2014 6 11 991 EWR DFW 194 ## distance hour sum_delay ## 1: 1372 7 2992 ## 2: NA 13 2464 ## 3: 1372 10 2135 ## 4: 1372 6 2171 ## 5: 1372 7 2095 ## 6: 1372 11 1980
聚合數據
為了聚合數據,我們在方括號by
提供了第三個參數。 然後,在j
中我們需要提供聚合函數調用,這樣才能真正聚合數據。 j
參數中使用的.N
符號對應於每組中所有觀測值的數量。 如前所述,聚合可以與行和選擇列上的子集組合。
ans <- DT[, .(m_arr_delay = mean(arr_delay), m_dep_delay = mean(dep_delay), count = .N), .(carrier, month)] head(ans)
## carrier month m_arr_delay m_dep_delay count ## 1: AA 10 5.541959 7.591497 2705 ## 2: AA 4 1.903324 3.987008 2617 ## 3: AA 6 8.690067 11.476475 2678 ## 4: AA 9 -1.235160 3.307078 2628 ## 5: AA 8 4.027474 8.914054 2839 ## 6: AA 7 9.159886 11.665953 2802
通常,我們可能需要將行的值與其在組中的聚合進行比較。 在 SQL 中,我們通過AVG(arr_delay) OVER (PARTITION BY carrier, month)
在分區上應用聚合。
ans <- DT[, .(arr_delay, carrierm_mean_arr = mean(arr_delay), dep_delay, carrierm_mean_dep = mean(dep_delay)), .(carrier, month)] head(ans)
## carrier month arr_delay carrierm_mean_arr dep_delay carrierm_mean_dep ## 1: AA 10 1494 5.541959 1498 7.591497 ## 2: AA 10 840 5.541959 848 7.591497 ## 3: AA 10 317 5.541959 338 7.591497 ## 4: AA 10 292 5.541959 331 7.591497 ## 5: AA 10 322 5.541959 304 7.591497 ## 6: AA 10 306 5.541959 299 7.591497
如果我們不想使用這些聚合查詢數據,而只是通過引用將它們放入實際的表更新中,我們可以使用:=
運算符來完成。 這避免了數據集的內存副本,因此我們不需要將結果分配給新變量。
DT[, `:=`(carrierm_mean_arr = mean(arr_delay), carrierm_mean_dep = mean(dep_delay)), .(carrier, month)] head(DT)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1241 2014 4 15 1223 JFK BOS 39 ## 3: AA 1071 2014 6 13 1064 EWR DFW 175 ## 4: AA 1056 2014 9 12 1115 EWR DFW 198 ## 5: AA 1022 2014 6 16 1073 EWR DFW 178 ## 6: AA 989 2014 6 11 991 EWR DFW 194 ## distance hour sum_delay carrierm_mean_arr carrierm_mean_dep ## 1: 1372 7 2992 5.541959 7.591497 ## 2: NA 13 2464 1.903324 3.987008 ## 3: 1372 10 2135 8.690067 11.476475 ## 4: 1372 6 2171 -1.235160 3.307078 ## 5: 1372 7 2095 8.690067 11.476475 ## 6: 1372 11 1980 8.690067 11.476475
加入數據集
數據集的 Base R 連接和合併被認為是一種特殊類型的子集操作。 我們提供了一個數據集,我們希望在第一個方括號參數i
中加入該數據集。 對於提供給i
的數據集中的每一行,我們匹配使用[
的數據集中的行。 如果我們只想保留匹配的行(內部連接),那麼我們傳遞一個額外的參數nomatch = 0L
。 我們使用on
參數來指定我們想要加入兩個數據集的列。

# create reference subset carrierdest <- DT[, .(count=.N), .(carrier, dest) # count by carrier and dest ][1:10 # just 10 first groups ] # chaining `[...][...]` as subqueries print(carrierdest)
## carrier dest count ## 1: AA DFW 5877 ## 2: AA BOS 1173 ## 3: AA ORD 4798 ## 4: AA SEA 298 ## 5: AA EGE 85 ## 6: AA LAX 3449 ## 7: AA MIA 6058 ## 8: AA SFO 1312 ## 9: AA AUS 297 ## 10: AA DCA 172
# outer join ans <- carrierdest[DT, on = c("carrier","dest")] print(ans)
## carrier dest count dep_delay year month day arr_delay origin ## 1: AA DFW 5877 1498 2014 10 4 1494 EWR ## 2: AA BOS 1173 1241 2014 4 15 1223 JFK ## 3: AA DFW 5877 1071 2014 6 13 1064 EWR ## 4: AA DFW 5877 1056 2014 9 12 1115 EWR ## 5: AA DFW 5877 1022 2014 6 16 1073 EWR ## --- ## 253312: WN BNA NA -12 2014 3 9 -21 LGA ## 253313: WN MDW NA -13 2014 3 10 -18 EWR ## 253314: WN HOU NA -13 2014 5 17 -30 LGA ## 253315: WN MKE NA -13 2014 6 15 10 LGA ## 253316: WN CAK NA -13 2014 8 19 -30 LGA ## air_time distance hour sum_delay carrierm_mean_arr ## 1: 200 1372 7 2992 5.541959 ## 2: 39 NA 13 2464 1.903324 ## 3: 175 1372 10 2135 8.690067 ## 4: 198 1372 6 2171 -1.235160 ## 5: 178 1372 7 2095 8.690067 ## --- ## 253312: 115 764 16 -33 6.921642 ## 253313: 112 711 20 -31 6.921642 ## 253314: 202 1428 17 -43 22.875845 ## 253315: 101 738 20 -3 14.888889 ## 253316: 63 397 16 -43 7.219670 ## carrierm_mean_dep ## 1: 7.591497 ## 2: 3.987008 ## 3: 11.476475 ## 4: 3.307078 ## 5: 11.476475 ## --- ## 253312: 11.295709 ## 253313: 11.295709 ## 253314: 30.546453 ## 253315: 24.217560 ## 253316: 17.038047
# inner join ans <- DT[carrierdest, # for each row in carrierdest nomatch = 0L, # return only matching rows from both tables on = c("carrier","dest")] # joining on columns carrier and dest print(ans)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1071 2014 6 13 1064 EWR DFW 175 ## 3: AA 1056 2014 9 12 1115 EWR DFW 198 ## 4: AA 1022 2014 6 16 1073 EWR DFW 178 ## 5: AA 989 2014 6 11 991 EWR DFW 194 ## --- ## 23515: AA -8 2014 10 11 -13 JFK DCA 53 ## 23516: AA -9 2014 5 21 -12 JFK DCA 52 ## 23517: AA -9 2014 6 5 -6 JFK DCA 53 ## 23518: AA -9 2014 10 2 -21 JFK DCA 51 ## 23519: AA -11 2014 5 27 10 JFK DCA 55 ## distance hour sum_delay carrierm_mean_arr carrierm_mean_dep count ## 1: 1372 7 2992 5.541959 7.591497 5877 ## 2: 1372 10 2135 8.690067 11.476475 5877 ## 3: 1372 6 2171 -1.235160 3.307078 5877 ## 4: 1372 7 2095 8.690067 11.476475 5877 ## 5: 1372 11 1980 8.690067 11.476475 5877 ## --- ## 23515: NA 15 -21 5.541959 7.591497 172 ## 23516: NA 15 -21 4.150172 8.733665 172 ## 23517: NA 15 -15 8.690067 11.476475 172 ## 23518: NA 15 -30 5.541959 7.591497 172 ## 23519: NA 15 -1 4.150172 8.733665 172
請注意,由於基本 R 子集的一致性,外連接默認為RIGHT OUTER
。 如果我們正在尋找LEFT OUTER
,我們需要交換錶,如上例所示。 使用與基本 R merge
data.frame
相同的 API,也可以在merge
data.table
方法中輕鬆控制確切的行為。
如果我們想簡單地在數據集中查找列,我們可以在加入時使用j
參數中的:=
運算符有效地做到這一點。 與我們通過引用進行子分配相同的方式,如更新數據集部分中所述,我們現在只是通過引用從我們加入的數據集中添加一列。 這避免了數據在內存中的複制,因此我們不需要將結果分配給新變量。
DT[carrierdest, # data.table to join with lkp.count := count, # lookup `count` column from `carrierdest` on = c("carrier","dest")] # join by columns head(DT)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1241 2014 4 15 1223 JFK BOS 39 ## 3: AA 1071 2014 6 13 1064 EWR DFW 175 ## 4: AA 1056 2014 9 12 1115 EWR DFW 198 ## 5: AA 1022 2014 6 16 1073 EWR DFW 178 ## 6: AA 989 2014 6 11 991 EWR DFW 194 ## distance hour sum_delay carrierm_mean_arr carrierm_mean_dep lkp.count ## 1: 1372 7 2992 5.541959 7.591497 5877 ## 2: NA 13 2464 1.903324 3.987008 1173 ## 3: 1372 10 2135 8.690067 11.476475 5877 ## 4: 1372 6 2171 -1.235160 3.307078 5877 ## 5: 1372 7 2095 8.690067 11.476475 5877 ## 6: 1372 11 1980 8.690067 11.476475 5877
對於聚合 while join ,使用by = .EACHI
。 它執行不會實現中間連接結果的連接,並將動態應用聚合,從而提高內存效率。
滾動連接是一種不常見的功能,專為處理有序數據而設計。 它非常適合處理時間數據和一般的時間序列。 它基本上將連接條件中的匹配滾動到下一個匹配值。 通過在加入時提供roll
參數來使用它。
快速重疊連接通過使用各種重疊運算符來連接基於週期及其重疊處理的數據集: any
、 within
、 start
、 end
。
目前正在開發使用非相等條件連接數據集的非等連接功能。
分析數據
在探索我們的數據集時,我們有時可能希望收集有關該主題的技術信息,以更好地了解數據的質量。
描述性統計
summary(DT)
## carrier dep_delay year month ## Length:253316 Min. :-112.00 Min. :2014 Min. : 1.000 ## Class :character 1st Qu.: -5.00 1st Qu.:2014 1st Qu.: 3.000 ## Mode :character Median : -1.00 Median :2014 Median : 6.000 ## Mean : 12.47 Mean :2014 Mean : 5.639 ## 3rd Qu.: 11.00 3rd Qu.:2014 3rd Qu.: 8.000 ## Max. :1498.00 Max. :2014 Max. :10.000 ## ## day arr_delay origin dest ## Min. : 1.00 Min. :-112.000 Length:253316 Length:253316 ## 1st Qu.: 8.00 1st Qu.: -15.000 Class :character Class :character ## Median :16.00 Median : -4.000 Mode :character Mode :character ## Mean :15.89 Mean : 8.147 ## 3rd Qu.:23.00 3rd Qu.: 15.000 ## Max. :31.00 Max. :1494.000 ## ## air_time distance hour sum_delay ## Min. : 20.0 Min. : 80.0 Min. : 0.00 Min. :-224.00 ## 1st Qu.: 86.0 1st Qu.: 529.0 1st Qu.: 9.00 1st Qu.: -19.00 ## Median :134.0 Median : 762.0 Median :13.00 Median : -5.00 ## Mean :156.7 Mean : 950.4 Mean :13.06 Mean : 20.61 ## 3rd Qu.:199.0 3rd Qu.:1096.0 3rd Qu.:17.00 3rd Qu.: 23.00 ## Max. :706.0 Max. :4963.0 Max. :24.00 Max. :2992.00 ## NA's :81483 ## carrierm_mean_arr carrierm_mean_dep lkp.count ## Min. :-22.403 Min. :-4.500 Min. : 85 ## 1st Qu.: 2.676 1st Qu.: 7.815 1st Qu.:3449 ## Median : 6.404 Median :11.354 Median :5877 ## Mean : 8.147 Mean :12.465 Mean :4654 ## 3rd Qu.: 11.554 3rd Qu.:17.564 3rd Qu.:6058 ## Max. : 86.182 Max. :52.864 Max. :6058 ## NA's :229797
基數
我們可以使用uniqueN
函數檢查數據的唯一性,並將其應用於每一列。 下面查詢中的對象.SD
對應於Data.table的S子集:
DT[, lapply(.SD, uniqueN)]
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: 14 570 1 10 31 616 3 109 509 ## distance hour sum_delay carrierm_mean_arr carrierm_mean_dep lkp.count ## 1: 152 25 1021 134 134 11
NA比率
為了計算每列的未知值(R 中的NA
和 SQL 中的NULL
)的比率,我們提供了應用於每一列的所需函數。
DT[, lapply(.SD, function(x) sum(is.na(x))/.N)]
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: 0 0 0 0 0 0 0 0 0 ## distance hour sum_delay carrierm_mean_arr carrierm_mean_dep lkp.count ## 1: 0.3216654 0 0 0 0 0.9071555
導出數據
data.table
包還提供了將表格數據快速導出為CSV
格式的功能。
tmp.csv <- tempfile(fileext=".csv") fwrite(DT, tmp.csv) # preview exported data cat(system(paste("head -3",tmp.csv), intern=TRUE), sep="\n")
## carrier,dep_delay,year,month,day,arr_delay,origin,dest,air_time,distance,hour,sum_delay,carrierm_mean_arr,carrierm_mean_dep,lkp.count ## AA,1498,2014,10,4,1494,EWR,DFW,200,1372,7,2992,5.54195933456561,7.59149722735674,5877 ## AA,1241,2014,4,15,1223,JFK,BOS,39,,13,2464,1.90332441727168,3.98700802445548,1173
在撰寫本文時, fwrite
函數尚未發佈到 CRAN 存儲庫。 要使用它我們需要安裝data.table
開發版本,否則我們可以使用base R write.csv
函數,但不要指望它很快。
資源
有很多可用的資源。 除了每個功能可用的手冊外,還有包小插曲,它們是圍繞特定主題的教程。 這些可以在入門頁面上找到。 此外,演示文稿頁面列出了來自全球data.table
演示文稿的 30 多種材料(幻燈片、視頻等)。 此外,社區的支持多年來一直在增長,最近在 Stack Overflow data.table
標籤上達到了第 4000 個問題,仍然有很高的比例(91.9%)的問題得到回答。 下圖顯示了 Stack Overflow 上data.table
標記問題的數量。
概括
本文提供了使用data.table
包在 R 中進行高效表格數據轉換的選定示例。 可以通過尋找可重現的基準來檢查有關性能的實際數據。 我發表了一篇關於 R 語言排名前 50 位的 StackOverflow 問題的data.table
解決方案的摘要博客文章,名為 Solve common R questions effective with data.table,您可以在其中找到大量數據和可重現的代碼。 包data.table
對其分組操作使用快速基數排序的本機實現,並為快速子集/連接使用二進制搜索。 此基數排序已從版本 3.3.0 併入基礎 R 中。 此外,該算法最近在 H2O 機器學習平台中實現並在 H2O 集群上並行化,從而在 10B x 10B 行上實現高效的大連接。