socialgekon.com
  • Главни
  • Животни Циклус Производа
  • Мобиле
  • Остало
  • Уи Десигн
Бацк-Енд

Побољшајте мењање података помоћу Р.

Језик Р се често доживљава као језик статистичара и научника података. Давно је то углавном било тачно. Међутим, током година флексибилност коју Р пружа путем пакета претворила је Р у језик опште намене. Р је био отворен 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Б .

Повезан: Врхунска манипулација сакупљањем података у меморији помоћу Супергроуп.јс

Како направити фото колаж на иПхоне-у: апликације и идеје

Уређивање

Како направити фото колаж на иПхоне-у: апликације и идеје
Супер једноставан водич за иконографију

Супер једноставан водич за иконографију

Уи Десигн

Популар Постс
Зашто размотрити редизајн веб странице - савети и препоруке
Зашто размотрити редизајн веб странице - савети и препоруке
Шта вреди стартуп? Смернице и најбоље праксе
Шта вреди стартуп? Смернице и најбоље праксе
Развој паметних сатова: да ли паметни сатови вреде проблема?
Развој паметних сатова: да ли паметни сатови вреде проблема?
Да ли су сви трендови вредни тога? 5 најчешћих УКС грешака које дизајнери праве
Да ли су сви трендови вредни тога? 5 најчешћих УКС грешака које дизајнери праве
Како уређивати ИоуТубе видео записе на иПхоне-у помоћу ИоуТубе уређивача
Како уређивати ИоуТубе видео записе на иПхоне-у помоћу ИоуТубе уређивача
 
Соул хиперцикл и талас нових фитнес бутика
Соул хиперцикл и талас нових фитнес бутика
Стратегије одређивања цена за успех: Практични водич
Стратегије одређивања цена за успех: Практични водич
Изазов Интернет цензура: Како сам направио веб локацију за прикупљање проверених микроблога
Изазов Интернет цензура: Како сам направио веб локацију за прикупљање проверених микроблога
Аутоматски поставите веб апликације користећи ГитХуб Вебхоокс
Аутоматски поставите веб апликације користећи ГитХуб Вебхоокс
Водич за стримовање Апацхе Спарк-а: Идентификовање хасхтагова у тренду са Твиттера
Водич за стримовање Апацхе Спарк-а: Идентификовање хасхтагова у тренду са Твиттера
Категорије
Рисе Оф РемотеПрофитабилност И ЕфикасностНаука О Подацима И Базе ПодатакаИнтернет Фронт-ЕндДизајн БрендаПројектни МенаџментЉуди И ТимовиТрендовиЖивот ДизајнераБудућност Посла

© 2023 | Сва Права Задржана

socialgekon.com