galaaz 0.4.8 → 0.4.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +319 -32
- data/Rakefile +16 -2
- data/bin/grun +1 -1
- data/bin/gstudio +1 -1
- data/blogs/gknit/gknit.Rmd +191 -104
- data/blogs/gknit/gknit.html +129 -57
- data/blogs/gknit/gknit.md +230 -104
- data/blogs/gknit/gknit.pdf +0 -0
- data/blogs/gknit/gknit.tex +1360 -0
- data/blogs/gknit/lst.rds +0 -0
- data/blogs/gknit/marshal.dump +0 -0
- data/blogs/gknit/stats.bib +27 -0
- data/blogs/manual/manual.Rmd +114 -2
- data/blogs/manual/manual.html +251 -8
- data/blogs/manual/manual.md +319 -8
- data/blogs/manual/manual_files/figure-html/diverging_bar.png +0 -0
- data/blogs/ruby_plot/ruby_plot.html +3 -3
- data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_jitter.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-html/final_violin_plot.png +0 -0
- data/blogs/ruby_plot/ruby_plot_files/figure-html/violin_with_jitter.png +0 -0
- data/examples/misc/moneyball.rb +1 -1
- data/examples/misc/subsetting.rb +37 -37
- data/lib/R_interface/robject.rb +2 -12
- data/lib/R_interface/ruby_extensions.rb +5 -2
- data/lib/gknit/knitr_engine.rb +2 -9
- data/lib/util/inline_file.rb +7 -3
- data/specs/tmp.rb +15 -24
- data/version.rb +1 -1
- metadata +7 -4
- data/blogs/gknit/gknit_files/figure-html/bubble-1.png +0 -0
- data/blogs/gknit/gknit_files/figure-html/diverging_bar.png +0 -0
data/blogs/gknit/lst.rds
ADDED
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
|
+
}
|
data/blogs/manual/manual.Rmd
CHANGED
@@ -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...]
|
data/blogs/manual/manual.html
CHANGED
@@ -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:
|
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-
|
562
|
-
## /home/rbotafogo/lib/graalvm-ce-1.0.0-
|
563
|
-
## /home/rbotafogo/lib/graalvm-ce-1.0.0-
|
564
|
-
## /home/rbotafogo/lib/graalvm-ce-1.0.0-
|
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-
|
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-
|
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
|
## <REPL>: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 > 20, :dest != "NHL")
|
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 = "https://raw.githubusercontent.com/Rdatatable/data.table/master/vignettes/flights14.csv"
|
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("b","b","b","a","a","c"),
|
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] "b" "b" "b" "a" "a" "c"</code></pre>
|
2566
|
+
<pre class="ruby"><code># subset rows in i
|
2567
|
+
ans = @flights[(:origin.eq "JFK") & (: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
|
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: "Normalised mileage from 'mtcars'",
|
2726
|
+
title: "Diverging Bars") +
|
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">
|
data/blogs/manual/manual.md
CHANGED
@@ -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:
|
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-
|
231
|
-
## /home/rbotafogo/lib/graalvm-ce-1.0.0-
|
232
|
-
## /home/rbotafogo/lib/graalvm-ce-1.0.0-
|
233
|
-
## /home/rbotafogo/lib/graalvm-ce-1.0.0-
|
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-
|
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-
|
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...]
|