Језик Р се често доживљава као језик статистичара и научника података. Давно је то углавном било тачно. Међутим, током година флексибилност коју Р пружа путем пакета претворила је Р у језик опште намене. Р је био отворен 1995. године и од тада спремишта Р пакета непрестано расту . Ипак, у поређењу са језицима као што је Питхон, Р је снажно заснован на подацима.
Говорећи о подацима, табеларни подаци заслужују посебну пажњу, јер су то један од најчешће коришћених типова података. То је тип података који одговара структури табеле познате у базама података, где свака колона може бити различитог типа, а перформансе обраде тог одређеног типа података пресудан су фактор за многе апликације.
У овом чланку ћемо представити како ефикасно постићи табеларну трансформацију података. Много људи који користе Р. већ за машинско учење нису свесни да мењање података може да се уради брже у Р, и да за то не треба да користе други алат.
База Р је увела data.frame
класе 1997. године, која је пре тога била заснована на С-ПЛУС. За разлику од често коришћених база података које складиште податке ред по ред, Р data.frame
податке складишти у меморији као структуру оријентисану на колону, чинећи је тако ефикаснијом у предмеморији за операције колона које су уобичајене у аналитици. Поред тога, иако је Р функцијски програмски језик, он то не намеће програмеру. Обе могућности су добро решене data.table
Р пакет, који је доступан у ЦРАН репозиторијуму. Изводи се прилично брзо приликом груписања операција, а посебно је ефикасан у меморији, пажљив при материјализацији подскупова средњих података, као што је материјализација само оних колона неопходних за одређени задатак. Такође избегава непотребне копије путем својих референтна семантика приликом додавања или ажурирања колона. Прва верзија пакета објављена је у априлу 2006. године, што је значајно побољшало data.frame
перформансе у то време. Почетни опис пакета био је:
Овај пакет чини врло мало. Једини разлог његовог постојања је тај што бела књига прецизира да дата.фраме мора имати имена редова. Овај пакет дефинише нову класу дата.табле која ради баш као дата.фраме, али користи до 10 пута мање меморије и може бити и до 10 пута бржа за стварање (и копирање). Такође користи прилику да дозволи подскупове () и са () сличне изразе унутар []. Већина кода се копира из основних функција са уклоњеним кодом који манипулише ров.намес.
Од тада, оба data.frame
и data.table
имплементације су побољшане, али data.table
остаје да буде невероватно бржи од основе Р. У ствари, data.table
није само бржи од основног Р, већ се чини да је то један од најбржих доступних алата за преметање података отвореног кода, који се такмиче са алатима попут Питхон Пандас , и базе података са стубним складиштем или апликације за велике податке попут Искра . Његов учинак у односу на дистрибуирану заједничку инфраструктуру још увек није мерен, али могућност да има до две милијарде редова на једном примерку даје обећавајуће изгледе. Изванредне перформансе иду руку под руку са функционалности . Поред тога, са недавним напорима на паралелизацији делова који одузимају пуно времена за постепено повећање перформанси, један правац ка померању ограничења перформанси изгледа сасвим јасно.
Учење Р постаје мало лакше због чињенице да делује интерактивно, тако да у сваком тренутку можемо пратити примере и гледати резултате сваког корака. Пре него што започнемо, инсталирајмо data.table
пакет из спремишта ЦРАН.
install.packages('data.table')
Корисни наговештај : Приручник било које функције можемо отворити тако што ћемо јој откуцати водећи знак питања, тј. ?install.packages
.
Постоји мноштво пакета за издвајање података из широког спектра формата и база података, што често укључује изворне управљачке програме. Учитаћемо податке из ЦСВ датотека, најчешћи формат сирових табеларних података. Датотека коришћена у следећим примерима се може наћи овде . Не морамо се мучити око 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
Ако наши подаци нису добро моделирани за даљу обраду, јер их треба преобликовати из дугачке у широку или широку у дугу (познату и као пивот и унпивот ), можемо погледати ?dcast
и ?melt
функције, познате из преобликовати2 пакет. Међутим, data.table
примењује брже и меморијски ефикасне методе за класу дата.табле / дата.фраме.
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
у многим аспектима одговара СКЛ упитима са којима би могао бити упознат већи број људи. DT
доле представља data.table
објект и одговара СКЛ-овима 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
Најчешће нам не требају обоје оригинални скуп података и поредани / сортирани скуп података. Подразумевано, језик Р, слично осталим функционалним програмским језицима, враћа сортиране податке као нови објекат и самим тим ће захтевати двоструко више меморије од сортирања према референци.
Направимо подскуп скупова података за порекло лета „ЈФК“ и месец од 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
морамо да пружимо обједињене позиве функција, тако да се подаци могу стварно објединити. Тхе .N
симбол који се користи у j
аргумент одговара броју свих запажања у свакој групи. Као што је претходно поменуто, агрегати се могу комбиновати са подскуповима у редовима и избором колона.
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
Често ћемо можда морати да упоредимо вредност реда са његовим агрегатом по групи. У СКЛ-у примењујемо агрегати над партицијом по : 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
Басе Р спајање и спајање скупова података сматра се посебном врстом подскуп операција. Пружамо скуп података којем желимо да се придружимо у првом аргументу у квадратним заградама 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
Имајте на уму да је због доследности подскупу базе Р спољно спајање подразумевано RIGHT OUTER
. Ако тражимо LEFT OUTER
, треба да заменимо табеле, као у примеру изнад. Тачно понашање се такође лако може контролисати у merge
data.table
метода, користећи исти АПИ као основа Р merge
data.frame
.
Ако желимо једноставно да пронађемо колоне у нашем скупу података, то можемо ефикасно да урадимо са :=
оператор у 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
За објединити док се придружују , користите 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
у доњем упиту одговара С. убсет оф Д. ата.табле:
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
у Р и 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
Брз извоз табеларних података у CSV
формат такође пружа data.table
пакет.
tmp.csv <- tempfile(fileext='.csv') fwrite(DT, tmp.csv) # preview exported data cat(system(paste('head -3',tmp.csv), intern=TRUE), sep='
')
## 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
функција још увек није објављена у спремишту ЦРАН. Да бисмо је користили морамо инсталирај data.table
развојна верзија , у супротном можемо користити основу Р write.csv
функција, али не очекујте да ће бити брза.
Доступно је пуно ресурса. Поред приручника доступних за сваку функцију, постоје и вињете са пакетима, које су водичи фокусирани на одређену тему. Они се могу наћи на Почетак страна. Поред тога, Презентације страница садржи више од 30 материјала (дијапозитиви, видео итд.) из data.table
презентације широм света. Такође, подршка заједнице је порасла током година, недавно досегнувши 4000. питање о преливању стека data.table
ознака, и даље има висок однос (91,9%) одговора на питања. Доња парцела представља број data.table
тагована питања о преливању стека током времена.
Овај чланак пружа одабране примере за ефикасну табеларну трансформацију података у Р помоћу data.table
пакет. Стварне бројке перформанси могу се испитати тражењем поновљивих референтних вредности. Објавио сам резиме блога о data.table
решења за 50 најбоље оцењених СтацкОверфлов питања за језик Р. Решите уобичајене Р проблеме ефикасно помоћу дата.табле , где можете пронаћи пуно слика и поновљиви код. Пакет data.table
користи нативну имплементацију брзог радик редоследа за своје операције груписања и бинарну претрагу брзих подскупова / придруживања. Ово наручивање радика је уграђено у базу Р из верзије 3.3.0 . Поред тога, алгоритам је недавно имплементиран у платформу за машинско учење Х2О и паралелизован преко Х2О кластера, омогућавајући ефикасне велике спојеве на редовима 10Б к 10Б .