galaaz 0.4.8 → 0.4.9

Sign up to get free protection for your applications and to get access to all the features.
Binary file
File without changes
@@ -0,0 +1,27 @@
1
+ @book{Wilkinson:grammar_of_graphics,
2
+ author = {Wilkinson, Leland},
3
+ title = {The Grammar of Graphics (Statistics and Computing)},
4
+ year = {2005},
5
+ isbn = {0387245448},
6
+ publisher = {Springer-Verlag},
7
+ address = {Berlin, Heidelberg},
8
+ }
9
+
10
+ @article{Knuth:literate_programming,
11
+ author = {Knuth, Donald E.},
12
+ title = {Literate Programming},
13
+ journal = {Comput. J.},
14
+ issue_date = {May 1984},
15
+ volume = {27},
16
+ number = {2},
17
+ month = may,
18
+ year = {1984},
19
+ issn = {0010-4620},
20
+ pages = {97--111},
21
+ numpages = {15},
22
+ url = {http://dx.doi.org/10.1093/comjnl/27.2.97},
23
+ doi = {10.1093/comjnl/27.2.97},
24
+ acmid = {479},
25
+ publisher = {Oxford University Press},
26
+ address = {Oxford, UK},
27
+ }
@@ -693,6 +693,93 @@ puts @flights_sm.head.as__data__frame
693
693
  puts @flights_sm.head.as__data__frame
694
694
  ```
695
695
 
696
+ ## Summarising data
697
+
698
+ Function 'summarise' calculates summaries for the data frame. When no 'group_by' is used
699
+ a single value is obtained from the data frame:
700
+
701
+ ```{ruby summarise}
702
+ puts @flights.summarise(delay: E.mean(:dep_delay, na__rm: true)).as__data__frame
703
+ ```
704
+
705
+ When a data frame is groupe with 'group_by' summaries apply to the given group:
706
+
707
+ ```{ruby summarise_group_by}
708
+ by_day = @flights.group_by(:year, :month, :day)
709
+ puts by_day.summarise(delay: :dep_delay.mean(na__rm: true)).head.as__data__frame
710
+ ```
711
+
712
+ Next we put many operations together by pipping them one after the other:
713
+
714
+ ```{ruby pipping}
715
+ delays = @flights.
716
+ group_by(:dest).
717
+ summarise(
718
+ count: E.n,
719
+ dist: :distance.mean(na__rm: true),
720
+ delay: :arr_delay.mean(na__rm: true)).
721
+ filter(:count > 20, :dest != "NHL")
722
+
723
+ puts delays.as__data__frame
724
+ ```
725
+
726
+ # Using Data Table
727
+
728
+ ```{ruby fread}
729
+ R.library('data.table')
730
+ R.install_and_loads('curl')
731
+
732
+ input = "https://raw.githubusercontent.com/Rdatatable/data.table/master/vignettes/flights14.csv"
733
+ @flights = R.fread(input)
734
+ puts @flights
735
+ puts @flights.dim
736
+ ```
737
+
738
+ ```{ruby data_table}
739
+
740
+ data_table = R.data__table(
741
+ ID: R.c("b","b","b","a","a","c"),
742
+ a: (1..6),
743
+ b: (7..12),
744
+ c: (13..18)
745
+ )
746
+
747
+ puts data_table
748
+ puts data_table.ID
749
+ ```
750
+
751
+ ```{ruby subset_i}
752
+ # subset rows in i
753
+ ans = @flights[(:origin.eq "JFK") & (:month.eq 6)]
754
+ puts ans.head
755
+
756
+ # Get the first two rows from flights.
757
+
758
+ ans = @flights[(1..2)]
759
+ puts ans
760
+
761
+ # Sort flights first by column origin in ascending order, and then by dest in descending order:
762
+
763
+ # ans = @flights[E.order(:origin, -(:dest))]
764
+ # puts ans.head
765
+
766
+ ```
767
+
768
+ ```{ruby select_j}
769
+ # Select column(s) in j
770
+ # select arr_delay column, but return it as a vector.
771
+
772
+ ans = @flights[:all, :arr_delay]
773
+ puts ans.head
774
+
775
+ # Select arr_delay column, but return as a data.table instead.
776
+
777
+ ans = @flights[:all, :arr_delay.list]
778
+ puts ans.head
779
+
780
+ ans = @flights[:all, E.list(:arr_delay, :dep_delay)]
781
+ ```
782
+
696
783
  # Graphics in Galaaz
697
784
 
698
785
  Creating graphics in Galaaz is quite easy, as it can use all the power of ggplot2. There are
@@ -731,8 +818,33 @@ the data frame with the necessary data:
731
818
  puts @mtcars
732
819
  ```
733
820
  Now, lets plot the diverging bar plot. When using gKnit, there is no need to call
734
- 'R.awt' to create a plotting device, since gKnit does take care of it:
735
-
821
+ 'R.awt' to create a plotting device, since gKnit does take care of it. Galaaz
822
+ provides integration with ggplot. The interested reader should check online for more
823
+ information on ggplot, since it is outside the scope of this manual describing
824
+ how ggplot works. We give here but a brief description on how this plot is generated.
825
+
826
+ ggplot implements the 'grammar of graphics'. In this approach, plots are build by
827
+ adding layers to the plot. On the first layer we describe what we want on the 'x'
828
+ and 'y' axis of the plot. In this case, we have 'car_name' on the 'x' axis and
829
+ 'mpg\_z' on the 'y' axis. Then the type of graph is specified by adding
830
+ 'geom\_bar' (for a bar graph). We specify that our bars should be filled using
831
+ 'mpg\_type', which is either 'above' or 'bellow' giving then two colours for
832
+ filling. On the next layer we specify the labels for the graph, then we add the
833
+ title and subtitle. Finally, in a bar chart usually bars go on the vertical direction,
834
+ but in this graph we want the bars to be horizontally layed so we add 'coord\_flip'.
835
+
836
+ ```{ruby diverging_bar, fig.width = 9.1, fig.height = 6.5}
837
+ require 'ggplot'
838
+
839
+ puts @mtcars.ggplot(E.aes(x: :car_name, y: :mpg_z, label: :mpg_z)) +
840
+ R.geom_bar(E.aes(fill: :mpg_type), stat: 'identity', width: 0.5) +
841
+ R.scale_fill_manual(name: 'Mileage',
842
+ labels: R.c('Above Average', 'Below Average'),
843
+ values: R.c('above': '#00ba38', 'below': '#f8766d')) +
844
+ R.labs(subtitle: "Normalised mileage from 'mtcars'",
845
+ title: "Diverging Bars") +
846
+ R.coord_flip
847
+ ```
736
848
 
737
849
 
738
850
  [TO BE CONTINUED...]
@@ -552,22 +552,22 @@ double
552
552
  ## (eval):1:in `exec_ruby'
553
553
  ## /home/rbotafogo/desenv/galaaz/lib/util/exec_ruby.rb:141:in `instance_eval'
554
554
  ## /home/rbotafogo/desenv/galaaz/lib/util/exec_ruby.rb:141:in `exec_ruby'
555
- ## /home/rbotafogo/desenv/galaaz/lib/gknit/knitr_engine.rb:657:in `block in initialize'
555
+ ## /home/rbotafogo/desenv/galaaz/lib/gknit/knitr_engine.rb:650:in `block in initialize'
556
556
  ## /home/rbotafogo/desenv/galaaz/lib/R_interface/ruby_callback.rb:77:in `call'
557
557
  ## /home/rbotafogo/desenv/galaaz/lib/R_interface/ruby_callback.rb:77:in `callback'
558
558
  ## (eval):3:in `function(...) {\n rb_method(...)'
559
559
  ## unknown.r:1:in `in_dir'
560
560
  ## unknown.r:1:in `block_exec:BLOCK0'
561
- ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc15/jre/languages/R/library/knitr/R/block.R:102:in `block_exec'
562
- ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc15/jre/languages/R/library/knitr/R/block.R:92:in `call_block'
563
- ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc15/jre/languages/R/library/knitr/R/block.R:6:in `process_group.block'
564
- ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc15/jre/languages/R/library/knitr/R/block.R:3:in `<no source>'
561
+ ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc16/jre/languages/R/library/knitr/R/block.R:102:in `block_exec'
562
+ ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc16/jre/languages/R/library/knitr/R/block.R:92:in `call_block'
563
+ ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc16/jre/languages/R/library/knitr/R/block.R:6:in `process_group.block'
564
+ ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc16/jre/languages/R/library/knitr/R/block.R:3:in `<no source>'
565
565
  ## unknown.r:1:in `withCallingHandlers'
566
566
  ## unknown.r:1:in `process_file'
567
567
  ## unknown.r:1:in `<no source>:BLOCK1'
568
- ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc15/jre/languages/R/library/knitr/R/output.R:129:in `<no source>'
568
+ ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc16/jre/languages/R/library/knitr/R/output.R:129:in `<no source>'
569
569
  ## unknown.r:1:in `<no source>:BLOCK1'
570
- ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc15/jre/languages/R/library/rmarkdown/R/render.R:162:in `<no source>'
570
+ ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc16/jre/languages/R/library/rmarkdown/R/render.R:162:in `<no source>'
571
571
  ## <REPL>:5:in `<repl wrapper>'
572
572
  ## &lt;REPL&gt;:1</code></pre>
573
573
  <p>Here is a vector with logical values</p>
@@ -2385,6 +2385,237 @@ puts @flights_sm.head.as__data__frame</code></pre>
2385
2385
  ## 5 2013 1 1 -6 -25 762 116 19 394.1379
2386
2386
  ## 6 2013 1 1 -4 12 719 150 -16 287.6000</code></pre>
2387
2387
  </div>
2388
+ <div id="summarising-data" class="section level2">
2389
+ <h2>Summarising data</h2>
2390
+ <p>Function ‘summarise’ calculates summaries for the data frame. When no ‘group_by’ is used a single value is obtained from the data frame:</p>
2391
+ <pre class="ruby"><code>puts @flights.summarise(delay: E.mean(:dep_delay, na__rm: true)).as__data__frame</code></pre>
2392
+ <pre><code>## delay
2393
+ ## 1 12.63907</code></pre>
2394
+ <p>When a data frame is groupe with ‘group_by’ summaries apply to the given group:</p>
2395
+ <pre class="ruby"><code>by_day = @flights.group_by(:year, :month, :day)
2396
+ puts by_day.summarise(delay: :dep_delay.mean(na__rm: true)).head.as__data__frame</code></pre>
2397
+ <pre><code>## year month day delay
2398
+ ## 1 2013 1 1 11.548926
2399
+ ## 2 2013 1 2 13.858824
2400
+ ## 3 2013 1 3 10.987832
2401
+ ## 4 2013 1 4 8.951595
2402
+ ## 5 2013 1 5 5.732218
2403
+ ## 6 2013 1 6 7.148014</code></pre>
2404
+ <p>Next we put many operations together by pipping them one after the other:</p>
2405
+ <pre class="ruby"><code>delays = @flights.
2406
+ group_by(:dest).
2407
+ summarise(
2408
+ count: E.n,
2409
+ dist: :distance.mean(na__rm: true),
2410
+ delay: :arr_delay.mean(na__rm: true)).
2411
+ filter(:count &gt; 20, :dest != &quot;NHL&quot;)
2412
+
2413
+ puts delays.as__data__frame</code></pre>
2414
+ <pre><code>## dest count dist delay
2415
+ ## 1 ABQ 254 1826.00000 4.38188976
2416
+ ## 2 ACK 265 199.00000 4.85227273
2417
+ ## 3 ALB 439 143.00000 14.39712919
2418
+ ## 4 ATL 17215 757.10822 11.30011285
2419
+ ## 5 AUS 2439 1514.25297 6.01990875
2420
+ ## 6 AVL 275 583.58182 8.00383142
2421
+ ## 7 BDL 443 116.00000 7.04854369
2422
+ ## 8 BGR 375 378.00000 8.02793296
2423
+ ## 9 BHM 297 865.99663 16.87732342
2424
+ ## 10 BNA 6333 758.21348 11.81245891
2425
+ ## 11 BOS 15508 190.63696 2.91439222
2426
+ ## 12 BQN 896 1578.98326 8.24549550
2427
+ ## 13 BTV 2589 265.09154 8.95099602
2428
+ ## 14 BUF 4681 296.80837 8.94595186
2429
+ ## 15 BUR 371 2465.00000 8.17567568
2430
+ ## 16 BWI 1781 179.41830 10.72673385
2431
+ ## 17 BZN 36 1882.00000 7.60000000
2432
+ ## 18 CAE 116 603.55172 41.76415094
2433
+ ## 19 CAK 864 397.00000 19.69833729
2434
+ ## 20 CHO 52 305.00000 9.50000000
2435
+ ## 21 CHS 2884 632.91678 10.59296847
2436
+ ## 22 CLE 4573 414.17428 9.18161129
2437
+ ## 23 CLT 14064 538.02730 7.36031885
2438
+ ## 24 CMH 3524 476.55505 10.60132291
2439
+ ## 25 CRW 138 444.00000 14.67164179
2440
+ ## 26 CVG 3941 575.15986 15.36456376
2441
+ ## 27 DAY 1525 537.10230 12.68048606
2442
+ ## 28 DCA 9705 211.00618 9.06695204
2443
+ ## 29 DEN 7266 1614.67836 8.60650021
2444
+ ## 30 DFW 8738 1383.04303 0.32212685
2445
+ ## 31 DSM 569 1020.88752 19.00573614
2446
+ ## 32 DTW 9384 498.12852 5.42996346
2447
+ ## 33 EGE 213 1735.70892 6.30434783
2448
+ ## 34 FLL 12055 1070.06877 8.08212154
2449
+ ## 35 GRR 765 605.78170 18.18956044
2450
+ ## 36 GSO 1606 449.84184 14.11260054
2451
+ ## 37 GSP 849 595.95995 15.93544304
2452
+ ## 38 HNL 707 4972.67468 -1.36519258
2453
+ ## 39 HOU 2115 1420.15508 7.17618819
2454
+ ## 40 IAD 5700 224.84684 13.86420212
2455
+ ## 41 IAH 7198 1407.20672 4.24079040
2456
+ ## 42 ILM 110 500.00000 4.63551402
2457
+ ## 43 IND 2077 652.26288 9.94043412
2458
+ ## 44 JAC 25 1875.60000 28.09523810
2459
+ ## 45 JAX 2720 824.67610 11.84483416
2460
+ ## 46 LAS 5997 2240.96148 0.25772849
2461
+ ## 47 LAX 16174 2468.62236 0.54711094
2462
+ ## 48 LGB 668 2465.00000 -0.06202723
2463
+ ## 49 MCI 2008 1097.69522 14.51405836
2464
+ ## 50 MCO 14082 943.11057 5.45464309
2465
+ ## 51 MDW 4113 718.04595 12.36422360
2466
+ ## 52 MEM 1789 954.20123 10.64531435
2467
+ ## 53 MHT 1009 207.02973 14.78755365
2468
+ ## 54 MIA 11728 1091.55244 0.29905978
2469
+ ## 55 MKE 2802 733.38151 14.16722038
2470
+ ## 56 MSN 572 803.95455 20.19604317
2471
+ ## 57 MSP 7185 1017.40167 7.27016886
2472
+ ## 58 MSY 3799 1177.70571 6.49017497
2473
+ ## 59 MVY 221 173.00000 -0.28571429
2474
+ ## 60 MYR 59 550.66102 4.60344828
2475
+ ## 61 OAK 312 2576.00000 3.07766990
2476
+ ## 62 OKC 346 1325.00000 30.61904762
2477
+ ## 63 OMA 849 1135.56655 14.69889841
2478
+ ## 64 ORD 17283 729.00081 5.87661475
2479
+ ## 65 ORF 1536 288.52344 10.94909344
2480
+ ## 66 PBI 6554 1028.83811 8.56297210
2481
+ ## 67 PDX 1354 2445.56573 5.14157973
2482
+ ## 68 PHL 1632 94.32353 10.12719014
2483
+ ## 69 PHX 4656 2141.30326 2.09704733
2484
+ ## 70 PIT 2875 334.06122 7.68099053
2485
+ ## 71 PSE 365 1617.00000 7.87150838
2486
+ ## 72 PVD 376 160.00000 16.23463687
2487
+ ## 73 PWM 2352 276.12840 11.66040210
2488
+ ## 74 RDU 8163 426.75769 10.05238095
2489
+ ## 75 RIC 2454 281.40465 20.11125320
2490
+ ## 76 ROC 2416 259.25083 11.56064461
2491
+ ## 77 RSW 3537 1072.85327 3.23814963
2492
+ ## 78 SAN 2737 2437.29923 3.13916574
2493
+ ## 79 SAT 686 1578.34111 6.94537178
2494
+ ## 80 SAV 804 709.18408 15.12950601
2495
+ ## 81 SDF 1157 645.98358 12.66938406
2496
+ ## 82 SEA 3923 2412.66531 -1.09909910
2497
+ ## 83 SFO 13331 2577.92356 2.67289152
2498
+ ## 84 SJC 329 2569.00000 3.44817073
2499
+ ## 85 SJU 5819 1599.83365 2.52052659
2500
+ ## 86 SLC 2467 1986.98662 0.17625459
2501
+ ## 87 SMF 284 2521.00000 12.10992908
2502
+ ## 88 SNA 825 2434.00000 -7.86822660
2503
+ ## 89 SRQ 1211 1044.65153 3.08243131
2504
+ ## 90 STL 4339 878.72321 11.07846451
2505
+ ## 91 STT 522 1626.98276 -3.83590734
2506
+ ## 92 SYR 1761 205.92164 8.90392501
2507
+ ## 93 TPA 7466 1003.93557 7.40852503
2508
+ ## 94 TUL 315 1215.00000 33.65986395
2509
+ ## 95 TVC 101 652.38614 12.96842105
2510
+ ## 96 TYS 631 638.80983 24.06920415
2511
+ ## 97 XNA 1036 1142.50579 7.46572581</code></pre>
2512
+ </div>
2513
+ </div>
2514
+ <div id="using-data-table" class="section level1">
2515
+ <h1>Using Data Table</h1>
2516
+ <pre class="ruby"><code>R.library('data.table')
2517
+ R.install_and_loads('curl')
2518
+
2519
+ input = &quot;https://raw.githubusercontent.com/Rdatatable/data.table/master/vignettes/flights14.csv&quot;
2520
+ @flights = R.fread(input)
2521
+ puts @flights
2522
+ puts @flights.dim</code></pre>
2523
+ <pre><code>## year month day dep_delay arr_delay carrier origin dest air_time
2524
+ ## 1: 2014 1 1 14 13 AA JFK LAX 359
2525
+ ## 2: 2014 1 1 -3 13 AA JFK LAX 363
2526
+ ## 3: 2014 1 1 2 9 AA JFK LAX 351
2527
+ ## 4: 2014 1 1 -8 -26 AA LGA PBI 157
2528
+ ## 5: 2014 1 1 2 1 AA JFK LAX 350
2529
+ ## ---
2530
+ ## 253312: 2014 10 31 1 -30 UA LGA IAH 201
2531
+ ## 253313: 2014 10 31 -5 -14 UA EWR IAH 189
2532
+ ## 253314: 2014 10 31 -8 16 MQ LGA RDU 83
2533
+ ## 253315: 2014 10 31 -4 15 MQ LGA DTW 75
2534
+ ## 253316: 2014 10 31 -5 1 MQ LGA SDF 110
2535
+ ## distance hour
2536
+ ## 1: 2475 9
2537
+ ## 2: 2475 11
2538
+ ## 3: 2475 19
2539
+ ## 4: 1035 7
2540
+ ## 5: 2475 13
2541
+ ## ---
2542
+ ## 253312: 1416 14
2543
+ ## 253313: 1400 8
2544
+ ## 253314: 431 11
2545
+ ## 253315: 502 11
2546
+ ## 253316: 659 8
2547
+ ## [1] 253316 11</code></pre>
2548
+ <pre class="ruby"><code>
2549
+ data_table = R.data__table(
2550
+ ID: R.c(&quot;b&quot;,&quot;b&quot;,&quot;b&quot;,&quot;a&quot;,&quot;a&quot;,&quot;c&quot;),
2551
+ a: (1..6),
2552
+ b: (7..12),
2553
+ c: (13..18)
2554
+ )
2555
+
2556
+ puts data_table
2557
+ puts data_table.ID</code></pre>
2558
+ <pre><code>## ID a b c
2559
+ ## 1: b 1 7 13
2560
+ ## 2: b 2 8 14
2561
+ ## 3: b 3 9 15
2562
+ ## 4: a 4 10 16
2563
+ ## 5: a 5 11 17
2564
+ ## 6: c 6 12 18
2565
+ ## [1] &quot;b&quot; &quot;b&quot; &quot;b&quot; &quot;a&quot; &quot;a&quot; &quot;c&quot;</code></pre>
2566
+ <pre class="ruby"><code># subset rows in i
2567
+ ans = @flights[(:origin.eq &quot;JFK&quot;) &amp; (:month.eq 6)]
2568
+ puts ans.head
2569
+
2570
+ # Get the first two rows from flights.
2571
+
2572
+ ans = @flights[(1..2)]
2573
+ puts ans
2574
+
2575
+ # Sort flights first by column origin in ascending order, and then by dest in descending order:
2576
+
2577
+ # ans = @flights[E.order(:origin, -(:dest))]
2578
+ # puts ans.head</code></pre>
2579
+ <pre><code>## year month day dep_delay arr_delay carrier origin dest air_time
2580
+ ## 1: 2014 6 1 -9 -5 AA JFK LAX 324
2581
+ ## 2: 2014 6 1 -10 -13 AA JFK LAX 329
2582
+ ## 3: 2014 6 1 18 -1 AA JFK LAX 326
2583
+ ## 4: 2014 6 1 -6 -16 AA JFK LAX 320
2584
+ ## 5: 2014 6 1 -4 -45 AA JFK LAX 326
2585
+ ## 6: 2014 6 1 -6 -23 AA JFK LAX 329
2586
+ ## distance hour
2587
+ ## 1: 2475 8
2588
+ ## 2: 2475 12
2589
+ ## 3: 2475 7
2590
+ ## 4: 2475 10
2591
+ ## 5: 2475 18
2592
+ ## 6: 2475 14
2593
+ ## year month day dep_delay arr_delay carrier origin dest air_time
2594
+ ## 1: 2014 1 1 14 13 AA JFK LAX 359
2595
+ ## 2: 2014 1 1 -3 13 AA JFK LAX 363
2596
+ ## distance hour
2597
+ ## 1: 2475 9
2598
+ ## 2: 2475 11</code></pre>
2599
+ <pre class="ruby"><code># Select column(s) in j
2600
+ # select arr_delay column, but return it as a vector.
2601
+
2602
+ ans = @flights[:all, :arr_delay]
2603
+ puts ans.head
2604
+
2605
+ # Select arr_delay column, but return as a data.table instead.
2606
+
2607
+ ans = @flights[:all, :arr_delay.list]
2608
+ puts ans.head
2609
+
2610
+ ans = @flights[:all, E.list(:arr_delay, :dep_delay)]</code></pre>
2611
+ <pre><code>## [1] 13 13 9 -26 1 0
2612
+ ## arr_delay
2613
+ ## 1: 13
2614
+ ## 2: 13
2615
+ ## 3: 9
2616
+ ## 4: -26
2617
+ ## 5: 1
2618
+ ## 6: 0</code></pre>
2388
2619
  </div>
2389
2620
  <div id="graphics-in-galaaz" class="section level1">
2390
2621
  <h1>Graphics in Galaaz</h1>
@@ -2482,7 +2713,19 @@ puts @mtcars</code></pre>
2482
2713
  ## Lotus Europa Lotus Europa 1.71 above
2483
2714
  ## Fiat 128 Fiat 128 2.04 above
2484
2715
  ## Toyota Corolla Toyota Corolla 2.29 above</code></pre>
2485
- <p>Now, lets plot the diverging bar plot. When using gKnit, there is no need to call ‘R.awt’ to create a plotting device, since gKnit does take care of it:</p>
2716
+ <p>Now, lets plot the diverging bar plot. When using gKnit, there is no need to call ‘R.awt’ to create a plotting device, since gKnit does take care of it. Galaaz provides integration with ggplot. The interested reader should check online for more information on ggplot, since it is outside the scope of this manual describing how ggplot works. We give here but a brief description on how this plot is generated.</p>
2717
+ <p>ggplot implements the ‘grammar of graphics’. In this approach, plots are build by adding layers to the plot. On the first layer we describe what we want on the ‘x’ and ‘y’ axis of the plot. In this case, we have ‘car_name’ on the ‘x’ axis and ‘mpg_z’ on the ‘y’ axis. Then the type of graph is specified by adding ‘geom_bar’ (for a bar graph). We specify that our bars should be filled using ‘mpg_type’, which is either ‘above’ or ‘bellow’ giving then two colours for filling. On the next layer we specify the labels for the graph, then we add the title and subtitle. Finally, in a bar chart usually bars go on the vertical direction, but in this graph we want the bars to be horizontally layed so we add ‘coord_flip’.</p>
2718
+ <pre class="ruby"><code>require 'ggplot'
2719
+
2720
+ puts @mtcars.ggplot(E.aes(x: :car_name, y: :mpg_z, label: :mpg_z)) +
2721
+ R.geom_bar(E.aes(fill: :mpg_type), stat: 'identity', width: 0.5) +
2722
+ R.scale_fill_manual(name: 'Mileage',
2723
+ labels: R.c('Above Average', 'Below Average'),
2724
+ values: R.c('above': '#00ba38', 'below': '#f8766d')) +
2725
+ R.labs(subtitle: &quot;Normalised mileage from 'mtcars'&quot;,
2726
+ title: &quot;Diverging Bars&quot;) +
2727
+ R.coord_flip</code></pre>
2728
+ <p><img src="data:image/png;base64,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" /><!-- --></p>
2486
2729
  <p>[TO BE CONTINUED…]</p>
2487
2730
  </div>
2488
2731
  <div id="contributing" class="section level1">
@@ -221,22 +221,22 @@ vec = R.c(1, hello, 5)
221
221
  ## (eval):1:in `exec_ruby'
222
222
  ## /home/rbotafogo/desenv/galaaz/lib/util/exec_ruby.rb:141:in `instance_eval'
223
223
  ## /home/rbotafogo/desenv/galaaz/lib/util/exec_ruby.rb:141:in `exec_ruby'
224
- ## /home/rbotafogo/desenv/galaaz/lib/gknit/knitr_engine.rb:657:in `block in initialize'
224
+ ## /home/rbotafogo/desenv/galaaz/lib/gknit/knitr_engine.rb:650:in `block in initialize'
225
225
  ## /home/rbotafogo/desenv/galaaz/lib/R_interface/ruby_callback.rb:77:in `call'
226
226
  ## /home/rbotafogo/desenv/galaaz/lib/R_interface/ruby_callback.rb:77:in `callback'
227
227
  ## (eval):3:in `function(...) {\n rb_method(...)'
228
228
  ## unknown.r:1:in `in_dir'
229
229
  ## unknown.r:1:in `block_exec:BLOCK0'
230
- ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc15/jre/languages/R/library/knitr/R/block.R:102:in `block_exec'
231
- ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc15/jre/languages/R/library/knitr/R/block.R:92:in `call_block'
232
- ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc15/jre/languages/R/library/knitr/R/block.R:6:in `process_group.block'
233
- ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc15/jre/languages/R/library/knitr/R/block.R:3:in `<no source>'
230
+ ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc16/jre/languages/R/library/knitr/R/block.R:102:in `block_exec'
231
+ ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc16/jre/languages/R/library/knitr/R/block.R:92:in `call_block'
232
+ ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc16/jre/languages/R/library/knitr/R/block.R:6:in `process_group.block'
233
+ ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc16/jre/languages/R/library/knitr/R/block.R:3:in `<no source>'
234
234
  ## unknown.r:1:in `withCallingHandlers'
235
235
  ## unknown.r:1:in `process_file'
236
236
  ## unknown.r:1:in `<no source>:BLOCK1'
237
- ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc15/jre/languages/R/library/knitr/R/output.R:129:in `<no source>'
237
+ ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc16/jre/languages/R/library/knitr/R/output.R:129:in `<no source>'
238
238
  ## unknown.r:1:in `<no source>:BLOCK1'
239
- ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc15/jre/languages/R/library/rmarkdown/R/render.R:162:in `<no source>'
239
+ ## /home/rbotafogo/lib/graalvm-ce-1.0.0-rc16/jre/languages/R/library/rmarkdown/R/render.R:162:in `<no source>'
240
240
  ## <REPL>:5:in `<repl wrapper>'
241
241
  ## <REPL>:1
242
242
  ```
@@ -1764,6 +1764,288 @@ puts @flights_sm.head.as__data__frame
1764
1764
  ## 6 2013 1 1 -4 12 719 150 -16 287.6000
1765
1765
  ```
1766
1766
 
1767
+ ## Summarising data
1768
+
1769
+ Function 'summarise' calculates summaries for the data frame. When no 'group_by' is used
1770
+ a single value is obtained from the data frame:
1771
+
1772
+
1773
+ ```ruby
1774
+ puts @flights.summarise(delay: E.mean(:dep_delay, na__rm: true)).as__data__frame
1775
+ ```
1776
+
1777
+ ```
1778
+ ## delay
1779
+ ## 1 12.63907
1780
+ ```
1781
+
1782
+ When a data frame is groupe with 'group_by' summaries apply to the given group:
1783
+
1784
+
1785
+ ```ruby
1786
+ by_day = @flights.group_by(:year, :month, :day)
1787
+ puts by_day.summarise(delay: :dep_delay.mean(na__rm: true)).head.as__data__frame
1788
+ ```
1789
+
1790
+ ```
1791
+ ## year month day delay
1792
+ ## 1 2013 1 1 11.548926
1793
+ ## 2 2013 1 2 13.858824
1794
+ ## 3 2013 1 3 10.987832
1795
+ ## 4 2013 1 4 8.951595
1796
+ ## 5 2013 1 5 5.732218
1797
+ ## 6 2013 1 6 7.148014
1798
+ ```
1799
+
1800
+ Next we put many operations together by pipping them one after the other:
1801
+
1802
+
1803
+ ```ruby
1804
+ delays = @flights.
1805
+ group_by(:dest).
1806
+ summarise(
1807
+ count: E.n,
1808
+ dist: :distance.mean(na__rm: true),
1809
+ delay: :arr_delay.mean(na__rm: true)).
1810
+ filter(:count > 20, :dest != "NHL")
1811
+
1812
+ puts delays.as__data__frame
1813
+ ```
1814
+
1815
+ ```
1816
+ ## dest count dist delay
1817
+ ## 1 ABQ 254 1826.00000 4.38188976
1818
+ ## 2 ACK 265 199.00000 4.85227273
1819
+ ## 3 ALB 439 143.00000 14.39712919
1820
+ ## 4 ATL 17215 757.10822 11.30011285
1821
+ ## 5 AUS 2439 1514.25297 6.01990875
1822
+ ## 6 AVL 275 583.58182 8.00383142
1823
+ ## 7 BDL 443 116.00000 7.04854369
1824
+ ## 8 BGR 375 378.00000 8.02793296
1825
+ ## 9 BHM 297 865.99663 16.87732342
1826
+ ## 10 BNA 6333 758.21348 11.81245891
1827
+ ## 11 BOS 15508 190.63696 2.91439222
1828
+ ## 12 BQN 896 1578.98326 8.24549550
1829
+ ## 13 BTV 2589 265.09154 8.95099602
1830
+ ## 14 BUF 4681 296.80837 8.94595186
1831
+ ## 15 BUR 371 2465.00000 8.17567568
1832
+ ## 16 BWI 1781 179.41830 10.72673385
1833
+ ## 17 BZN 36 1882.00000 7.60000000
1834
+ ## 18 CAE 116 603.55172 41.76415094
1835
+ ## 19 CAK 864 397.00000 19.69833729
1836
+ ## 20 CHO 52 305.00000 9.50000000
1837
+ ## 21 CHS 2884 632.91678 10.59296847
1838
+ ## 22 CLE 4573 414.17428 9.18161129
1839
+ ## 23 CLT 14064 538.02730 7.36031885
1840
+ ## 24 CMH 3524 476.55505 10.60132291
1841
+ ## 25 CRW 138 444.00000 14.67164179
1842
+ ## 26 CVG 3941 575.15986 15.36456376
1843
+ ## 27 DAY 1525 537.10230 12.68048606
1844
+ ## 28 DCA 9705 211.00618 9.06695204
1845
+ ## 29 DEN 7266 1614.67836 8.60650021
1846
+ ## 30 DFW 8738 1383.04303 0.32212685
1847
+ ## 31 DSM 569 1020.88752 19.00573614
1848
+ ## 32 DTW 9384 498.12852 5.42996346
1849
+ ## 33 EGE 213 1735.70892 6.30434783
1850
+ ## 34 FLL 12055 1070.06877 8.08212154
1851
+ ## 35 GRR 765 605.78170 18.18956044
1852
+ ## 36 GSO 1606 449.84184 14.11260054
1853
+ ## 37 GSP 849 595.95995 15.93544304
1854
+ ## 38 HNL 707 4972.67468 -1.36519258
1855
+ ## 39 HOU 2115 1420.15508 7.17618819
1856
+ ## 40 IAD 5700 224.84684 13.86420212
1857
+ ## 41 IAH 7198 1407.20672 4.24079040
1858
+ ## 42 ILM 110 500.00000 4.63551402
1859
+ ## 43 IND 2077 652.26288 9.94043412
1860
+ ## 44 JAC 25 1875.60000 28.09523810
1861
+ ## 45 JAX 2720 824.67610 11.84483416
1862
+ ## 46 LAS 5997 2240.96148 0.25772849
1863
+ ## 47 LAX 16174 2468.62236 0.54711094
1864
+ ## 48 LGB 668 2465.00000 -0.06202723
1865
+ ## 49 MCI 2008 1097.69522 14.51405836
1866
+ ## 50 MCO 14082 943.11057 5.45464309
1867
+ ## 51 MDW 4113 718.04595 12.36422360
1868
+ ## 52 MEM 1789 954.20123 10.64531435
1869
+ ## 53 MHT 1009 207.02973 14.78755365
1870
+ ## 54 MIA 11728 1091.55244 0.29905978
1871
+ ## 55 MKE 2802 733.38151 14.16722038
1872
+ ## 56 MSN 572 803.95455 20.19604317
1873
+ ## 57 MSP 7185 1017.40167 7.27016886
1874
+ ## 58 MSY 3799 1177.70571 6.49017497
1875
+ ## 59 MVY 221 173.00000 -0.28571429
1876
+ ## 60 MYR 59 550.66102 4.60344828
1877
+ ## 61 OAK 312 2576.00000 3.07766990
1878
+ ## 62 OKC 346 1325.00000 30.61904762
1879
+ ## 63 OMA 849 1135.56655 14.69889841
1880
+ ## 64 ORD 17283 729.00081 5.87661475
1881
+ ## 65 ORF 1536 288.52344 10.94909344
1882
+ ## 66 PBI 6554 1028.83811 8.56297210
1883
+ ## 67 PDX 1354 2445.56573 5.14157973
1884
+ ## 68 PHL 1632 94.32353 10.12719014
1885
+ ## 69 PHX 4656 2141.30326 2.09704733
1886
+ ## 70 PIT 2875 334.06122 7.68099053
1887
+ ## 71 PSE 365 1617.00000 7.87150838
1888
+ ## 72 PVD 376 160.00000 16.23463687
1889
+ ## 73 PWM 2352 276.12840 11.66040210
1890
+ ## 74 RDU 8163 426.75769 10.05238095
1891
+ ## 75 RIC 2454 281.40465 20.11125320
1892
+ ## 76 ROC 2416 259.25083 11.56064461
1893
+ ## 77 RSW 3537 1072.85327 3.23814963
1894
+ ## 78 SAN 2737 2437.29923 3.13916574
1895
+ ## 79 SAT 686 1578.34111 6.94537178
1896
+ ## 80 SAV 804 709.18408 15.12950601
1897
+ ## 81 SDF 1157 645.98358 12.66938406
1898
+ ## 82 SEA 3923 2412.66531 -1.09909910
1899
+ ## 83 SFO 13331 2577.92356 2.67289152
1900
+ ## 84 SJC 329 2569.00000 3.44817073
1901
+ ## 85 SJU 5819 1599.83365 2.52052659
1902
+ ## 86 SLC 2467 1986.98662 0.17625459
1903
+ ## 87 SMF 284 2521.00000 12.10992908
1904
+ ## 88 SNA 825 2434.00000 -7.86822660
1905
+ ## 89 SRQ 1211 1044.65153 3.08243131
1906
+ ## 90 STL 4339 878.72321 11.07846451
1907
+ ## 91 STT 522 1626.98276 -3.83590734
1908
+ ## 92 SYR 1761 205.92164 8.90392501
1909
+ ## 93 TPA 7466 1003.93557 7.40852503
1910
+ ## 94 TUL 315 1215.00000 33.65986395
1911
+ ## 95 TVC 101 652.38614 12.96842105
1912
+ ## 96 TYS 631 638.80983 24.06920415
1913
+ ## 97 XNA 1036 1142.50579 7.46572581
1914
+ ```
1915
+
1916
+ # Using Data Table
1917
+
1918
+
1919
+ ```ruby
1920
+ R.library('data.table')
1921
+ R.install_and_loads('curl')
1922
+
1923
+ input = "https://raw.githubusercontent.com/Rdatatable/data.table/master/vignettes/flights14.csv"
1924
+ @flights = R.fread(input)
1925
+ puts @flights
1926
+ puts @flights.dim
1927
+ ```
1928
+
1929
+ ```
1930
+ ## year month day dep_delay arr_delay carrier origin dest air_time
1931
+ ## 1: 2014 1 1 14 13 AA JFK LAX 359
1932
+ ## 2: 2014 1 1 -3 13 AA JFK LAX 363
1933
+ ## 3: 2014 1 1 2 9 AA JFK LAX 351
1934
+ ## 4: 2014 1 1 -8 -26 AA LGA PBI 157
1935
+ ## 5: 2014 1 1 2 1 AA JFK LAX 350
1936
+ ## ---
1937
+ ## 253312: 2014 10 31 1 -30 UA LGA IAH 201
1938
+ ## 253313: 2014 10 31 -5 -14 UA EWR IAH 189
1939
+ ## 253314: 2014 10 31 -8 16 MQ LGA RDU 83
1940
+ ## 253315: 2014 10 31 -4 15 MQ LGA DTW 75
1941
+ ## 253316: 2014 10 31 -5 1 MQ LGA SDF 110
1942
+ ## distance hour
1943
+ ## 1: 2475 9
1944
+ ## 2: 2475 11
1945
+ ## 3: 2475 19
1946
+ ## 4: 1035 7
1947
+ ## 5: 2475 13
1948
+ ## ---
1949
+ ## 253312: 1416 14
1950
+ ## 253313: 1400 8
1951
+ ## 253314: 431 11
1952
+ ## 253315: 502 11
1953
+ ## 253316: 659 8
1954
+ ## [1] 253316 11
1955
+ ```
1956
+
1957
+
1958
+ ```ruby
1959
+
1960
+ data_table = R.data__table(
1961
+ ID: R.c("b","b","b","a","a","c"),
1962
+ a: (1..6),
1963
+ b: (7..12),
1964
+ c: (13..18)
1965
+ )
1966
+
1967
+ puts data_table
1968
+ puts data_table.ID
1969
+ ```
1970
+
1971
+ ```
1972
+ ## ID a b c
1973
+ ## 1: b 1 7 13
1974
+ ## 2: b 2 8 14
1975
+ ## 3: b 3 9 15
1976
+ ## 4: a 4 10 16
1977
+ ## 5: a 5 11 17
1978
+ ## 6: c 6 12 18
1979
+ ## [1] "b" "b" "b" "a" "a" "c"
1980
+ ```
1981
+
1982
+
1983
+ ```ruby
1984
+ # subset rows in i
1985
+ ans = @flights[(:origin.eq "JFK") & (:month.eq 6)]
1986
+ puts ans.head
1987
+
1988
+ # Get the first two rows from flights.
1989
+
1990
+ ans = @flights[(1..2)]
1991
+ puts ans
1992
+
1993
+ # Sort flights first by column origin in ascending order, and then by dest in descending order:
1994
+
1995
+ # ans = @flights[E.order(:origin, -(:dest))]
1996
+ # puts ans.head
1997
+ ```
1998
+
1999
+ ```
2000
+ ## year month day dep_delay arr_delay carrier origin dest air_time
2001
+ ## 1: 2014 6 1 -9 -5 AA JFK LAX 324
2002
+ ## 2: 2014 6 1 -10 -13 AA JFK LAX 329
2003
+ ## 3: 2014 6 1 18 -1 AA JFK LAX 326
2004
+ ## 4: 2014 6 1 -6 -16 AA JFK LAX 320
2005
+ ## 5: 2014 6 1 -4 -45 AA JFK LAX 326
2006
+ ## 6: 2014 6 1 -6 -23 AA JFK LAX 329
2007
+ ## distance hour
2008
+ ## 1: 2475 8
2009
+ ## 2: 2475 12
2010
+ ## 3: 2475 7
2011
+ ## 4: 2475 10
2012
+ ## 5: 2475 18
2013
+ ## 6: 2475 14
2014
+ ## year month day dep_delay arr_delay carrier origin dest air_time
2015
+ ## 1: 2014 1 1 14 13 AA JFK LAX 359
2016
+ ## 2: 2014 1 1 -3 13 AA JFK LAX 363
2017
+ ## distance hour
2018
+ ## 1: 2475 9
2019
+ ## 2: 2475 11
2020
+ ```
2021
+
2022
+
2023
+ ```ruby
2024
+ # Select column(s) in j
2025
+ # select arr_delay column, but return it as a vector.
2026
+
2027
+ ans = @flights[:all, :arr_delay]
2028
+ puts ans.head
2029
+
2030
+ # Select arr_delay column, but return as a data.table instead.
2031
+
2032
+ ans = @flights[:all, :arr_delay.list]
2033
+ puts ans.head
2034
+
2035
+ ans = @flights[:all, E.list(:arr_delay, :dep_delay)]
2036
+ ```
2037
+
2038
+ ```
2039
+ ## [1] 13 13 9 -26 1 0
2040
+ ## arr_delay
2041
+ ## 1: 13
2042
+ ## 2: 13
2043
+ ## 3: 9
2044
+ ## 4: -26
2045
+ ## 5: 1
2046
+ ## 6: 0
2047
+ ```
2048
+
1767
2049
  # Graphics in Galaaz
1768
2050
 
1769
2051
  Creating graphics in Galaaz is quite easy, as it can use all the power of ggplot2. There are
@@ -1872,8 +2154,37 @@ puts @mtcars
1872
2154
  ## Toyota Corolla Toyota Corolla 2.29 above
1873
2155
  ```
1874
2156
  Now, lets plot the diverging bar plot. When using gKnit, there is no need to call
1875
- 'R.awt' to create a plotting device, since gKnit does take care of it:
2157
+ 'R.awt' to create a plotting device, since gKnit does take care of it. Galaaz
2158
+ provides integration with ggplot. The interested reader should check online for more
2159
+ information on ggplot, since it is outside the scope of this manual describing
2160
+ how ggplot works. We give here but a brief description on how this plot is generated.
2161
+
2162
+ ggplot implements the 'grammar of graphics'. In this approach, plots are build by
2163
+ adding layers to the plot. On the first layer we describe what we want on the 'x'
2164
+ and 'y' axis of the plot. In this case, we have 'car_name' on the 'x' axis and
2165
+ 'mpg\_z' on the 'y' axis. Then the type of graph is specified by adding
2166
+ 'geom\_bar' (for a bar graph). We specify that our bars should be filled using
2167
+ 'mpg\_type', which is either 'above' or 'bellow' giving then two colours for
2168
+ filling. On the next layer we specify the labels for the graph, then we add the
2169
+ title and subtitle. Finally, in a bar chart usually bars go on the vertical direction,
2170
+ but in this graph we want the bars to be horizontally layed so we add 'coord\_flip'.
2171
+
2172
+
2173
+ ```ruby
2174
+ require 'ggplot'
2175
+
2176
+ puts @mtcars.ggplot(E.aes(x: :car_name, y: :mpg_z, label: :mpg_z)) +
2177
+ R.geom_bar(E.aes(fill: :mpg_type), stat: 'identity', width: 0.5) +
2178
+ R.scale_fill_manual(name: 'Mileage',
2179
+ labels: R.c('Above Average', 'Below Average'),
2180
+ values: R.c('above': '#00ba38', 'below': '#f8766d')) +
2181
+ R.labs(subtitle: "Normalised mileage from 'mtcars'",
2182
+ title: "Diverging Bars") +
2183
+ R.coord_flip
2184
+ ```
2185
+
1876
2186
 
2187
+ ![](/home/rbotafogo/desenv/galaaz/blogs/manual/manual_files/figure-html/diverging_bar.png)<!-- -->
1877
2188
 
1878
2189
 
1879
2190
  [TO BE CONTINUED...]