galaaz 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +32 -0
  3. data/Rakefile +177 -0
  4. data/bin/galaaz +8 -0
  5. data/examples/50Plots_MasterList/scatter_plot.rb +51 -0
  6. data/examples/baseball.csv +1 -0
  7. data/examples/baseball.rb +16 -0
  8. data/examples/ggplot.rb +178 -0
  9. data/examples/islr/Figure.jpg +0 -0
  10. data/examples/islr/all.rb +32 -0
  11. data/examples/islr/ch2.spec.rb +148 -0
  12. data/examples/islr/ch3.spec.rb +28 -0
  13. data/examples/islr/ch3_boston.rb +77 -0
  14. data/examples/islr/ch3_multiple_regression.rb +36 -0
  15. data/examples/islr/ch6.spec.rb +64 -0
  16. data/examples/paper/paper.rb +36 -0
  17. data/examples/sthda_ggplot/README.md +38 -0
  18. data/examples/sthda_ggplot/all.rb +68 -0
  19. data/examples/sthda_ggplot/one_variable_continuous/density_gg.rb +52 -0
  20. data/examples/sthda_ggplot/one_variable_continuous/geom_area.rb +61 -0
  21. data/examples/sthda_ggplot/one_variable_continuous/geom_density.rb +77 -0
  22. data/examples/sthda_ggplot/one_variable_continuous/geom_dotplot.rb +69 -0
  23. data/examples/sthda_ggplot/one_variable_continuous/geom_freqpoly.rb +69 -0
  24. data/examples/sthda_ggplot/one_variable_continuous/geom_histogram.rb +62 -0
  25. data/examples/sthda_ggplot/one_variable_continuous/histogram_density.rb +55 -0
  26. data/examples/sthda_ggplot/one_variable_continuous/stat.rb +62 -0
  27. data/examples/sthda_ggplot/one_variable_discrete/bar.rb +54 -0
  28. data/examples/sthda_ggplot/qplots/box_violin_dot.rb +57 -0
  29. data/examples/sthda_ggplot/qplots/scatter_plots.rb +67 -0
  30. data/examples/sthda_ggplot/scatter_gg.rb +60 -0
  31. data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_bin2d.rb +49 -0
  32. data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_density2d.rb +64 -0
  33. data/examples/sthda_ggplot/two_variables_cont_bivariate/geom_hex.rb +52 -0
  34. data/examples/sthda_ggplot/two_variables_cont_cont/geom_point.rb +65 -0
  35. data/examples/sthda_ggplot/two_variables_cont_cont/geom_smooth.rb +66 -0
  36. data/examples/sthda_ggplot/two_variables_cont_cont/misc.rb +83 -0
  37. data/examples/sthda_ggplot/two_variables_cont_function/geom_area.rb +63 -0
  38. data/examples/sthda_ggplot/two_variables_disc_cont/geom_bar.rb +85 -0
  39. data/examples/sthda_ggplot/two_variables_disc_cont/geom_boxplot.rb +62 -0
  40. data/examples/sthda_ggplot/two_variables_disc_cont/geom_dotplot.rb +75 -0
  41. data/examples/sthda_ggplot/two_variables_disc_cont/geom_jitter.rb +74 -0
  42. data/examples/sthda_ggplot/two_variables_disc_cont/geom_line.rb +55 -0
  43. data/examples/sthda_ggplot/two_variables_disc_cont/geom_violin.rb +70 -0
  44. data/examples/sthda_ggplot/two_variables_disc_disc/geom_jitter.rb +40 -0
  45. data/examples/sthda_ggplot/two_variables_error/geom_crossbar.rb +108 -0
  46. data/examples/subsetting.rb +372 -0
  47. data/lib/expression.rb +45 -0
  48. data/lib/galaaz.rb +27 -0
  49. data/lib/r.rb +118 -0
  50. data/lib/r_methods.rb +89 -0
  51. data/lib/rbinary_operators.rb +226 -0
  52. data/lib/rclosure.rb +34 -0
  53. data/lib/rdata_frame.rb +63 -0
  54. data/lib/renvironment.rb +34 -0
  55. data/lib/rexpression.rb +34 -0
  56. data/lib/rindexed_object.rb +68 -0
  57. data/lib/rlanguage.rb +64 -0
  58. data/lib/rlist.rb +72 -0
  59. data/lib/rmatrix.rb +38 -0
  60. data/lib/rmd_indexed_object.rb +43 -0
  61. data/lib/robject.rb +297 -0
  62. data/lib/rpkg.rb +53 -0
  63. data/lib/rsupport.rb +292 -0
  64. data/lib/rsupport_scope.rb +77 -0
  65. data/lib/rsymbol.rb +57 -0
  66. data/lib/ruby_callback.rb +83 -0
  67. data/lib/ruby_extensions.rb +74 -0
  68. data/lib/runary_operators.rb +58 -0
  69. data/lib/rvector.rb +117 -0
  70. data/r_requires/ggplot.rb +31 -0
  71. data/specs/all.rb +45 -0
  72. data/specs/r_dataframe.spec.rb +181 -0
  73. data/specs/r_eval.spec.rb +164 -0
  74. data/specs/r_function.spec.rb +105 -0
  75. data/specs/r_language.spec.rb +135 -0
  76. data/specs/r_list.spec.rb +129 -0
  77. data/specs/r_list_apply.spec.rb +99 -0
  78. data/specs/r_matrix.spec.rb +83 -0
  79. data/specs/r_vector_creation.spec.rb +99 -0
  80. data/specs/r_vector_functions.spec.rb +59 -0
  81. data/specs/r_vector_object.spec.rb +94 -0
  82. data/specs/r_vector_operators.spec.rb +174 -0
  83. data/specs/r_vector_subsetting.spec.rb +136 -0
  84. data/specs/tmp.rb +134 -0
  85. data/version.rb +2 -0
  86. metadata +198 -0
@@ -0,0 +1,75 @@
1
+ # coding: utf-8
2
+
3
+ ##########################################################################################
4
+ # @author Rodrigo Botafogo
5
+ #
6
+ # Copyright © 2018 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
7
+ # and distribute this software and its documentation, without fee and without a signed
8
+ # licensing agreement, is hereby granted, provided that the above copyright notice, this
9
+ # paragraph and the following two paragraphs appear in all copies, modifications, and
10
+ # distributions.
11
+ #
12
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
13
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
14
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
15
+ # POSSIBILITY OF SUCH DAMAGE.
16
+ #
17
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
19
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
20
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
21
+ # OR MODIFICATIONS.
22
+ ##########################################################################################
23
+
24
+ require 'galaaz'
25
+ require 'ggplot'
26
+
27
+ tooth_growth = ~:ToothGrowth
28
+ tooth_growth.dose = tooth_growth.dose.as__factor
29
+ puts tooth_growth
30
+
31
+ e = tooth_growth.ggplot(E.aes(x: :dose, y: :len))
32
+
33
+ R.awt
34
+
35
+ # Default plot
36
+ print e + R.geom_dotplot(binaxis: "y", stackdir: "center")
37
+
38
+ sleep(2)
39
+ R.grid__newpage
40
+
41
+ # Dot plot with mean points (+/- SD)
42
+ # stat_summary requires library Hmisc that does not yet install in
43
+ # graalvm
44
+ # print e + R.geom_dotplot(binaxis: "y", stackdir: "center") +
45
+ # R.stat_summary(fun__data: "mean_sdl", fun__args: E.list(mult: 1),
46
+ # geom: "pointrange", color: "red")
47
+
48
+ sleep(2)
49
+ R.grid__newpage
50
+
51
+ # Combine with box plot
52
+ print e + R.geom_boxplot +
53
+ R.geom_dotplot(binaxis: "y", stackdir: "center")
54
+
55
+ sleep(2)
56
+ R.grid__newpage
57
+
58
+ # Add violin plot
59
+ print e + R.geom_violin(trim: false) +
60
+ R.geom_dotplot(binaxis: 'y', stackdir: 'center')
61
+
62
+ sleep(2)
63
+ R.grid__newpage
64
+
65
+ # Color and fill by group (dose)
66
+ print e + R.geom_dotplot(E.aes(color: :dose, fill: :dose),
67
+ binaxis: "y", stackdir: "center")
68
+
69
+ sleep(2)
70
+ R.grid__newpage
71
+
72
+ # a = gets.chomp
73
+
74
+ # removes the window
75
+ R.dev__off
@@ -0,0 +1,74 @@
1
+ # coding: utf-8
2
+
3
+ ##########################################################################################
4
+ # @author Rodrigo Botafogo
5
+ #
6
+ # Copyright © 2018 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
7
+ # and distribute this software and its documentation, without fee and without a signed
8
+ # licensing agreement, is hereby granted, provided that the above copyright notice, this
9
+ # paragraph and the following two paragraphs appear in all copies, modifications, and
10
+ # distributions.
11
+ #
12
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
13
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
14
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
15
+ # POSSIBILITY OF SUCH DAMAGE.
16
+ #
17
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
19
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
20
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
21
+ # OR MODIFICATIONS.
22
+ ##########################################################################################
23
+
24
+ require 'galaaz'
25
+ require 'ggplot'
26
+
27
+ tooth_growth = ~:ToothGrowth
28
+ tooth_growth.dose = tooth_growth.dose.as__factor
29
+ puts tooth_growth
30
+
31
+ e = tooth_growth.ggplot(E.aes(x: :dose, y: :len))
32
+
33
+ R.awt
34
+
35
+ # Default plot
36
+ print e + R.geom_jitter(position: R.position_jitter(0.2))
37
+
38
+ sleep(2)
39
+ R.grid__newpage
40
+
41
+ # Strip charts with mean points (+/- SD)
42
+ print e + R.geom_jitter(position: R.position_jitter(0.2)) +
43
+ R.stat_summary(fun__data: "mean_sdl", fun__args: R.list(mult: 1),
44
+ geom: "pointrange", color: "red")
45
+
46
+ sleep(2)
47
+ R.grid__newpage
48
+
49
+ # Combine with box plot
50
+ print e + R.geom_jitter(position: R.position_jitter(0.2)) +
51
+ R.geom_dotplot(binaxis: "y", stackdir: "center")
52
+
53
+ sleep(2)
54
+ R.grid__newpage
55
+
56
+ # Add violin plot
57
+ print e + R.geom_violin(trim: false) +
58
+ R.geom_jitter(position: R.position_jitter(0.2))
59
+
60
+
61
+ sleep(2)
62
+ R.grid__newpage
63
+
64
+ # Change color and shape by group (dose)
65
+ print e + R.geom_jitter(E.aes(color: :dose, shape: :dose),
66
+ position: R.position_jitter(0.2))
67
+
68
+ sleep(2)
69
+ R.grid__newpage
70
+
71
+ # a = gets.chomp
72
+
73
+ # removes the window
74
+ R.dev__off
@@ -0,0 +1,55 @@
1
+ # coding: utf-8
2
+
3
+ ##########################################################################################
4
+ # @author Rodrigo Botafogo
5
+ #
6
+ # Copyright © 2018 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
7
+ # and distribute this software and its documentation, without fee and without a signed
8
+ # licensing agreement, is hereby granted, provided that the above copyright notice, this
9
+ # paragraph and the following two paragraphs appear in all copies, modifications, and
10
+ # distributions.
11
+ #
12
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
13
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
14
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
15
+ # POSSIBILITY OF SUCH DAMAGE.
16
+ #
17
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
19
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
20
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
21
+ # OR MODIFICATIONS.
22
+ ##########################################################################################
23
+
24
+ require 'galaaz'
25
+ require 'ggplot'
26
+
27
+ df = R.data__frame(supp: R.rep(R.c("VC", "OJ"), each: 3),
28
+ dose: R.rep(R.c("D0.5", "D1", "D2"), 2),
29
+ len: R.c(6.8, 15, 33, 4.2, 10, 29.5))
30
+ puts df.head
31
+
32
+
33
+ R.awt
34
+
35
+ # Change line types by groups (supp)
36
+ print df.ggplot(E.aes(x: :dose, y: :len, group: :supp)) +
37
+ R.geom_line(E.aes(linetype: :supp)) +
38
+ R.geom_point
39
+
40
+ sleep(2)
41
+ R.grid__newpage
42
+
43
+ # Change line types, point shapes and colors
44
+ print df.ggplot(E.aes(x: :dose, y: :len, group: :supp)) +
45
+ R.geom_line(E.aes(linetype: :supp, color: :supp)) +
46
+ R.geom_point(E.aes(shape: :supp, color: :supp))
47
+
48
+ sleep(2)
49
+ R.grid__newpage
50
+
51
+
52
+ # a = gets.chomp
53
+
54
+ # removes the window
55
+ R.dev__off
@@ -0,0 +1,70 @@
1
+ # coding: utf-8
2
+
3
+ ##########################################################################################
4
+ # @author Rodrigo Botafogo
5
+ #
6
+ # Copyright © 2018 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
7
+ # and distribute this software and its documentation, without fee and without a signed
8
+ # licensing agreement, is hereby granted, provided that the above copyright notice, this
9
+ # paragraph and the following two paragraphs appear in all copies, modifications, and
10
+ # distributions.
11
+ #
12
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
13
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
14
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
15
+ # POSSIBILITY OF SUCH DAMAGE.
16
+ #
17
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
19
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
20
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
21
+ # OR MODIFICATIONS.
22
+ ##########################################################################################
23
+
24
+ require 'galaaz'
25
+ require 'ggplot'
26
+
27
+ # Package Hmisc does not yet install on graalvm because of
28
+ # problems with package data.table
29
+ # Polyglot.eval("R", "library('Hmisc')")
30
+
31
+ tooth_growth = ~:ToothGrowth
32
+ tooth_growth.dose = tooth_growth.dose.as__factor
33
+ puts tooth_growth
34
+
35
+ e = tooth_growth.ggplot(E.aes(x: :dose, y: :len))
36
+
37
+ R.awt
38
+
39
+ # Default plot
40
+ print e + R.geom_violin(trim: false)
41
+
42
+ sleep(2)
43
+ R.grid__newpage
44
+
45
+ # violin plot with mean points (+/- SD)
46
+ # R.stat_summary requires Hmisc
47
+ print e + R.geom_violin(trim: false) +
48
+ R.stat_summary(fun__data: "mean_sdl", fun__args: E.list(mult: 1),
49
+ geom: "pointrange", color: "red")
50
+
51
+ # sleep(2)
52
+ # R.grid__newpage
53
+
54
+ # Combine with box plot
55
+ print e + R.geom_violin(trim: false) +
56
+ R.geom_boxplot(width: 0.2)
57
+
58
+ sleep(2)
59
+ R.grid__newpage
60
+
61
+ # Color by group (dose)
62
+ print e + R.geom_violin(E.aes(color: :dose), trim: false)
63
+
64
+ sleep(2)
65
+ R.grid__newpage
66
+
67
+ # a = gets.chomp
68
+
69
+ # removes the window
70
+ R.dev__off
@@ -0,0 +1,40 @@
1
+ # coding: utf-8
2
+
3
+ ##########################################################################################
4
+ # @author Rodrigo Botafogo
5
+ #
6
+ # Copyright © 2018 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
7
+ # and distribute this software and its documentation, without fee and without a signed
8
+ # licensing agreement, is hereby granted, provided that the above copyright notice, this
9
+ # paragraph and the following two paragraphs appear in all copies, modifications, and
10
+ # distributions.
11
+ #
12
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
13
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
14
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
15
+ # POSSIBILITY OF SUCH DAMAGE.
16
+ #
17
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
19
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
20
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
21
+ # OR MODIFICATIONS.
22
+ ##########################################################################################
23
+
24
+ require 'galaaz'
25
+ require 'ggplot'
26
+
27
+ diamonds = ~:diamonds
28
+
29
+ R.awt
30
+
31
+ print diamonds.ggplot(E.aes(:cut, :color)) +
32
+ R.geom_jitter(E.aes(color: :cut), size: 0.5)
33
+
34
+ sleep(2)
35
+ R.grid__newpage
36
+
37
+ # a = gets.chomp
38
+
39
+ # removes the window
40
+ R.dev__off
@@ -0,0 +1,108 @@
1
+ # coding: utf-8
2
+
3
+ ##########################################################################################
4
+ # @author Rodrigo Botafogo
5
+ #
6
+ # Copyright © 2018 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
7
+ # and distribute this software and its documentation, without fee and without a signed
8
+ # licensing agreement, is hereby granted, provided that the above copyright notice, this
9
+ # paragraph and the following two paragraphs appear in all copies, modifications, and
10
+ # distributions.
11
+ #
12
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
13
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
14
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
15
+ # POSSIBILITY OF SUCH DAMAGE.
16
+ #
17
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
19
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
20
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
21
+ # OR MODIFICATIONS.
22
+ ##########################################################################################
23
+
24
+ require 'galaaz'
25
+ require 'ggplot'
26
+
27
+ df = ~:ToothGrowth
28
+ df.dose = df.dose.as__factor
29
+ puts df.head
30
+
31
+ df2 = R.data__frame(
32
+ R.aggregate(df.len, by: R.list(df.dose), FUN: :mean),
33
+ R.aggregate(df.len, by: R.list(df.dose), FUN: :sd)[2]
34
+ )
35
+
36
+ df2.names = R.c("dose", "len", "sd")
37
+ puts df2.head
38
+
39
+ f = df2.ggplot(E.aes(x: :dose, y: :len,
40
+ ymin: :len - :sd,
41
+ ymax: :len + :sd))
42
+
43
+ df3 = R.data__frame(
44
+ R.aggregate(df.len, by: R.list(df.dose, df.supp), FUN: :mean),
45
+ R.aggregate(df.len, by: R.list(df.dose, df.supp), FUN: :sd)[3]
46
+ )
47
+
48
+ df3.names = R.c("dose", "supp", "len", "sd")
49
+ puts df3.head
50
+
51
+ R.awt
52
+
53
+ # Default plot
54
+ print f + R.geom_crossbar
55
+
56
+ sleep(2)
57
+ R.grid__newpage
58
+
59
+ # color by groups
60
+ print f + R.geom_crossbar(E.aes(color: :dose))
61
+
62
+ sleep(2)
63
+ R.grid__newpage
64
+
65
+ # Change color manually
66
+ print f + R.geom_crossbar(E.aes(color: :dose)) +
67
+ R.scale_color_manual(values: R.c("#999999", "#E69F00", "#56B4E9")) +
68
+ R.theme_minimal
69
+
70
+ sleep(2)
71
+ R.grid__newpage
72
+
73
+ # fill by groups and change color manually
74
+ print f + R.geom_crossbar(E.aes(fill: :dose)) +
75
+ R.scale_fill_manual(values: R.c("#999999", "#E69F00", "#56B4E9")) +
76
+ R.theme_minimal
77
+
78
+ sleep(2)
79
+ R.grid__newpage
80
+
81
+ f = df3.ggplot(E.aes(x: :dose, y: :len,
82
+ ymin: :len - :sd, ymax: :len + :sd))
83
+
84
+ # Default plot
85
+ print f + R.geom_crossbar(E.aes(color: :supp))
86
+
87
+ sleep(2)
88
+ R.grid__newpage
89
+
90
+ # Use position_dodge() to avoid overlap
91
+ print f + R.geom_crossbar(E.aes(color: :supp),
92
+ position: R.position_dodge(1))
93
+
94
+ sleep(2)
95
+ R.grid__newpage
96
+
97
+ f = df.ggplot(E.aes(x: :dose, y: :len, color: :supp))
98
+
99
+ # Use geom_crossbar()
100
+ print f + R.stat_summary(fun__data: "mean_sdl", fun__args: R.list(mult: 1),
101
+ geom: "crossbar", width: 0.6,
102
+ position: R.position_dodge(0.8))
103
+
104
+ # a = gets.chomp
105
+
106
+ # removes the window
107
+ sleep(2)
108
+ R.dev__off
@@ -0,0 +1,372 @@
1
+ # coding: utf-8
2
+
3
+ require 'galaaz'
4
+
5
+ # This examples were extracted from "Advanced R", by Hadley Wickham, available on the
6
+ # web at: http://adv-r.had.co.nz/Subsetting.html#applications
7
+
8
+ #------------------------------------------------------------------------------------------
9
+ # Lookup tables (character subsetting)
10
+ # Character matching provides a powerful way to make lookup tables.
11
+ # Say you want to convert abbreviations:
12
+ #------------------------------------------------------------------------------------------
13
+
14
+ x = R.c("m", "f", "u", "f", "f", "m", "m")
15
+ lookup = R.c(m: "Male", f: "Female", u: R::NA)
16
+ lookup[x].pp
17
+ print("\n")
18
+
19
+ # m f u f f m m
20
+ # "Male" "Female" NA "Female" "Female" "Male" "Male"
21
+
22
+ R.unname(lookup[x]).pp
23
+ print("\n")
24
+
25
+ # [1] "Male" "Female" NA "Female" "Female" "Male" "Male"
26
+
27
+
28
+ #------------------------------------------------------------------------------------------
29
+ # Matching and merging by hand (integer subsetting)
30
+ #------------------------------------------------------------------------------------------
31
+
32
+ # You may have a more complicated lookup table which has multiple columns of information.
33
+ # Suppose we have a vector of grades, and a table that describes their properties:
34
+ # In R a vector c(1, 2, 3) is a double vector, when using polyglot R.c(1, 2, 3) is an
35
+ # integer vector, the equivalent of doing c(1L, 2L, 3L) in R. Function 'match' does not
36
+ # work correctly with integer vector, it has to be a double.
37
+ grades = R.c(1.0, 2.0, 2.0, 3.0, 1.0)
38
+
39
+ info = R.data__frame(
40
+ grade: (3..1),
41
+ desc: R.c("Excellent", "Good", "Poor"),
42
+ fail: R.c(false, false, true)
43
+ )
44
+
45
+ # We want to duplicate the info table so that we have a row for each value in grades.
46
+ # We can do this in two ways, either using match() and integer subsetting,
47
+ # or rownames() and character subsetting:
48
+
49
+ # Using match
50
+ id = R.match(grades, info.grade)
51
+ info[id, :all].pp
52
+ print("\n")
53
+
54
+ # grade desc fail
55
+ # 3 1 Poor TRUE
56
+ # 2 2 Good FALSE
57
+ # 2.1 2 Good FALSE
58
+ # 1 3 Excellent FALSE
59
+ # 3.1 1 Poor TRUE
60
+
61
+ # Using rownames
62
+ info.rownames = info.grade
63
+ info[grades.as__character, :all].pp
64
+ print("\n")
65
+
66
+ # grade desc fail
67
+ # 1 3 Excellent FALSE
68
+ # 2 2 Good FALSE
69
+ # 2.1 2 Good FALSE
70
+ # 3 1 Poor TRUE
71
+ # 1.1 3 Excellent FALSE
72
+
73
+ #------------------------------------------------------------------------------------------
74
+ # Random samples/bootstrap (integer subsetting)
75
+ #------------------------------------------------------------------------------------------
76
+
77
+ # You can use integer indices to perform random sampling or bootstrapping
78
+ # of a vector or data frame. sample() generates a vector of indices, then
79
+ # subsetting to access the values:
80
+ df = R.data__frame(x: R.rep((1..3), each: 2), y: (6..1), z: R.letters[(1..6)])
81
+
82
+ # Set seed for reproducibility
83
+ R.set__seed(10)
84
+
85
+ # Randomly reorder
86
+ df[R.sample(df.nrow), :all].pp
87
+ print("\n")
88
+
89
+ # x y z
90
+ # 4 2 3 d
91
+ # 2 1 5 b
92
+ # 5 3 2 e
93
+ # 3 2 4 c
94
+ # 1 1 6 a
95
+ # 6 3 1 f
96
+
97
+ # Select 3 random rows
98
+ df[R.sample(df.nrow, 3), :all].pp
99
+ print("\n")
100
+
101
+ # x y z
102
+ # 2 1 5 b
103
+ # 6 3 1 f
104
+ # 3 2 4 c
105
+
106
+ # Select 6 bootstrap replicates
107
+ df[R.sample(df.nrow, 6, rep: true), :all].pp
108
+ print("\n")
109
+
110
+ # x y z
111
+ # 3 2 4 c
112
+ # 4 2 3 d
113
+ # 4.1 2 3 d
114
+ # 1 1 6 a
115
+ # 4.2 2 3 d
116
+ # 3.1 2 4 c
117
+
118
+ #------------------------------------------------------------------------------------------
119
+ # Ordering (integer subsetting)
120
+ #------------------------------------------------------------------------------------------
121
+
122
+ x = R.c("b", "c", "a")
123
+ x.order.pp
124
+ print("\n")
125
+
126
+ # [1] 3 1 2
127
+
128
+ x[x.order].pp
129
+ print("\n")
130
+
131
+ # [1] "a" "b" "c"
132
+
133
+ # Randomly reorder df
134
+ df2 = df[R.sample(df.nrow), (3..1)]
135
+ df2.pp
136
+ print("\n")
137
+
138
+ # z y x
139
+ # 3 c 4 2
140
+ # 1 a 6 1
141
+ # 2 b 5 1
142
+ # 4 d 3 2
143
+ # 6 f 1 3
144
+ # 5 e 2 3
145
+
146
+ df2[df2.x.order, :all].pp
147
+ print("\n")
148
+
149
+ # z y x
150
+ # 1 a 6 1
151
+ # 2 b 5 1
152
+ # 3 c 4 2
153
+ # 4 d 3 2
154
+ # 6 f 1 3
155
+ # 5 e 2 3
156
+
157
+ df2[:all, df2.names.order].pp
158
+ print("\n")
159
+
160
+ # x y z
161
+ # 3 2 4 c
162
+ # 1 1 6 a
163
+ # 2 1 5 b
164
+ # 4 2 3 d
165
+ # 6 3 1 f
166
+ # 5 3 2 e
167
+
168
+ #------------------------------------------------------------------------------------------
169
+ # Expanding aggregated counts (integer subsetting)
170
+ #
171
+ # Sometimes you get a data frame where identical rows have been collapsed into one and a
172
+ # count column has been added. rep() and integer subsetting make it easy to uncollapse
173
+ # the data by subsetting with a repeated row index:
174
+ #------------------------------------------------------------------------------------------
175
+
176
+ df = R.data__frame(x: R.c(2, 4, 1), y: R.c(9, 11, 6), n: R.c(3, 5, 1))
177
+ R.rep((1..df.nrow), df.n).pp
178
+ print("\n")
179
+
180
+ # [1] 1 1 1 2 2 2 2 2 3
181
+
182
+ df[R.rep((1..df.nrow), df.n), :all].pp
183
+ print("\n")
184
+
185
+ # x y n
186
+ # 1 2 9 3
187
+ # 1.1 2 9 3
188
+ # 1.2 2 9 3
189
+ # 2 4 11 5
190
+ # 2.1 4 11 5
191
+ # 2.2 4 11 5
192
+ # 2.3 4 11 5
193
+ # 2.4 4 11 5
194
+ # 3 1 6 1
195
+
196
+ #------------------------------------------------------------------------------------------
197
+ # Removing columns from data frames (character subsetting)
198
+ #
199
+ # There are two ways to remove columns from a data frame. You can set individual columns
200
+ # to nil:
201
+ #------------------------------------------------------------------------------------------
202
+
203
+ df = R.data__frame(x: (1..3), y: (3..1), z: R.letters[(1..3)])
204
+ # Not implemented yet
205
+ # df.z = nil
206
+ df.pp
207
+ print("\n")
208
+
209
+ df = R.data__frame(x: (1..3), y: (3..1), z: R.letters[(1..3)])
210
+ df[R.c("x", "y")].pp
211
+ print("\n")
212
+
213
+ # x y
214
+ # 1 1 3
215
+ # 2 2 2
216
+ # 3 3 1
217
+
218
+ df[df.names.setdiff("z")].pp
219
+ print("\n")
220
+
221
+ # x y
222
+ # 1 1 3
223
+ # 2 2 2
224
+ # 3 3 1
225
+
226
+ #------------------------------------------------------------------------------------------
227
+ # Selecting rows based on a condition (logical subsetting)
228
+ #
229
+ # Because it allows you to easily combine conditions from multiple columns, logical
230
+ # subsetting is probably the most commonly used technique for extracting rows out of
231
+ # a data frame.
232
+ #------------------------------------------------------------------------------------------
233
+
234
+ R.mtcars[R.mtcars.gear == 5, :all].pp
235
+ print("\n")
236
+
237
+ # mpg cyl disp hp drat wt qsec vs am gear carb
238
+ # Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.7 0 1 5 2
239
+ # Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2
240
+ # Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.5 0 1 5 4
241
+ # Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.5 0 1 5 6
242
+ # Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.6 0 1 5 8
243
+
244
+ R.mtcars[(R.mtcars.gear == 5) & (R.mtcars.cyl == 4), :all].pp
245
+ print("\n")
246
+
247
+ # mpg cyl disp hp drat wt qsec vs am gear carb
248
+ # Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.7 0 1 5 2
249
+ # Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2
250
+
251
+
252
+ #------------------------------------------------------------------------------------------
253
+ # Boolean algebra vs. sets (logical & integer subsetting)
254
+ #
255
+ # It’s useful to be aware of the natural equivalence between set operations (integer
256
+ # subsetting) and boolean algebra (logical subsetting)
257
+ #------------------------------------------------------------------------------------------
258
+
259
+ x = R.sample(10) < 4
260
+ x.which.pp
261
+ print("\n")
262
+
263
+ # [1] 3 7 10
264
+
265
+ #===
266
+ x1 = R.c((1..10)) % 2 == 0
267
+ x1.pp
268
+ print("\n")
269
+
270
+ # [1] FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE
271
+
272
+ #===
273
+ x2 = x1.which
274
+ x2.pp
275
+ print("\n")
276
+
277
+ # [1] 2 4 6 8 10
278
+
279
+ #===
280
+ y1 = R.c((1..10)) % 5 == 0
281
+ y1.pp
282
+ print("\n")
283
+
284
+ # [1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE
285
+
286
+ #===
287
+ y2 = y1.which
288
+ y2.pp
289
+ print("\n")
290
+
291
+ # [1] 5 10
292
+
293
+ #===
294
+ # X & Y <-> intersect(x, y)
295
+ (x1 & y1).pp
296
+ print("\n")
297
+
298
+ # [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
299
+
300
+ #===
301
+ # This example shows the problem with having R objects returning either
302
+ # vector or scalar. We don't know the type of the result of applying
303
+ # intersect. If this is a vector, then we need to print it with pp
304
+ # but if this is a scalar, we need to print it with regular Ruby 'p' or
305
+ # 'print'
306
+ p R.intersect(x2, y2)
307
+ print("\n")
308
+
309
+ # 10
310
+
311
+ p x2.intersect y2
312
+
313
+ # 10
314
+
315
+ #===
316
+ # X | Y <-> union(x, y)
317
+ (x1 | y1).pp
318
+ print("\n")
319
+
320
+ # [1] FALSE TRUE FALSE TRUE TRUE TRUE FALSE TRUE FALSE TRUE
321
+
322
+ #===
323
+ R.union(x2, y2).pp
324
+ print("\n")
325
+
326
+ # [1] 2 4 6 8 10 5
327
+
328
+ (x2.union y2).pp
329
+
330
+ # [1] 2 4 6 8 10 5
331
+
332
+ #===
333
+ # X & !Y <-> setdiff(x, y)
334
+ (x1 & !y1).pp
335
+ print("\n")
336
+
337
+ # [1] FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE FALSE
338
+
339
+ #===
340
+ R.setdiff(x2, y2).pp
341
+ print("\n")
342
+
343
+ # [1] 2 4 6 8
344
+
345
+ (x2.setdiff y2).pp
346
+
347
+ # [1] 2 4 6 8
348
+
349
+
350
+ #===
351
+ # xor(X, Y) <-> setdiff(union(x, y), intersect(x, y))
352
+ R.xor(x1, y1).pp
353
+ print("\n")
354
+
355
+ # [1] FALSE TRUE FALSE TRUE TRUE TRUE FALSE TRUE FALSE FALSE
356
+
357
+ # Writing the same as the last example in a Ruby style
358
+ (x1.xor y1).pp
359
+
360
+ # [1] FALSE TRUE FALSE TRUE TRUE TRUE FALSE TRUE FALSE FALSE
361
+
362
+ #===
363
+ R.setdiff(R.union(x2, y2), R.intersect(x2, y2)).pp
364
+ print("\n")
365
+
366
+ # [1] 2 4 6 8 5
367
+
368
+ # Writing the same as the last example in a Ruby style
369
+ ((x2.union y2).setdiff (x2.intersect y2)).pp
370
+ print("\n")
371
+
372
+ # [1] 2 4 6 8 5