forked from fxjollois/fxjollois.github.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinterrogation-r.html
272 lines (197 loc) · 10.7 KB
/
interrogation-r.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
<!DOCTYPE html>
<html>
<head>
<title>Interrogation de données avec R</title>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="chrome=1">
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="apple-mobile-web-app-capable" content="yes">
<link rel="stylesheet" media="all" href="libs/ioslides-13.5.1/fonts/fonts.css">
<link rel="stylesheet" media="all" href="libs/ioslides-13.5.1/theme/css/default.css">
<link rel="stylesheet" media="only screen and (max-device-width: 480px)" href="libs/ioslides-13.5.1/theme/css/phone.css">
<base target="_blank">
<script type="text/javascript">
var SLIDE_CONFIG = {
// Slide settings
settings: {
title: 'Interrogation de données avec R',
useBuilds: true,
usePrettify: true,
enableSlideAreas: true,
enableTouch: true,
},
// Author information
presenters: [
{
name: 'FX Jollois' ,
company: '',
gplus: '',
twitter: '',
www: '',
github: ''
},
]
};
</script>
<style type="text/css">
b, strong {
font-weight: bold;
}
em {
font-style: italic;
}
slides > slide {
-webkit-transition: all 0.4s ease-in-out;
-moz-transition: all 0.4s ease-in-out;
-o-transition: all 0.4s ease-in-out;
transition: all 0.4s ease-in-out;
}
.auto-fadein {
-webkit-transition: opacity 0.6s ease-in;
-webkit-transition-delay: 0.4s;
-moz-transition: opacity 0.6s ease-in 0.4s;
-o-transition: opacity 0.6s ease-in 0.4s;
transition: opacity 0.6s ease-in 0.4s;
opacity: 0;
}
</style>
<style>
slide img {
max-width: 100%;
}
</style>
</head>
<body style="opacity: 0">
<slides class="layout-widescreen">
<slide class="title-slide segue nobackground">
<!-- The content of this hgroup is replaced programmatically through the slide_config.json. -->
<hgroup class="auto-fadein">
<h1 data-config-title><!-- populated from slide_config.json --></h1>
<h2 data-config-subtitle><!-- populated from slide_config.json --></h2>
<p data-config-presenter><!-- populated from slide_config.json --></p>
<p style="margin-top: 6px; margin-left: -2px;">… ou comment faire du SQL sans SQL dans R</p>
</hgroup>
</slide>
<slide class=''><hgroup><h2>Introduction</h2></hgroup><article id="introduction">
<p>But de cette présentation :</p>
<blockquote>
<p>Présenter une comparaison (<strong>non exhaustive</strong>) entre le langage <strong>SQL</strong> et le langage <a href='http://www.r-project.org' title=''><strong>R</strong></a> pour l'<strong>interrogation</strong> d'une base de données relationnelles</p>
</blockquote>
<p>Plan :</p>
<ul>
<li>Rappel (très rapide) sur les concepts de l'algèbre relationnelle</li>
<li>Comment faire du SQL sous R ?</li>
<li>Comment faire autrement sous R ?</li>
</ul>
<p>Pré-requis :</p>
<ul>
<li>Connaissance du SQL</li>
<li>Connaissance du langage R</li>
</ul>
</article></slide><slide class=''><hgroup><h2>Interrogation de données</h2></hgroup><article id="interrogation-de-donnees">
<p>Ensemble des opérations de l'algèbre relationnelle utilisée pour obtenir des informations à partir d'une base de données relationnelles :</p>
<ul>
<li>Restriction</li>
<li>Projection</li>
<li>Calcul et fonction</li>
<li>Agrégat</li>
<li>Opérations ensemblistes</li>
<li>Jointures</li>
</ul>
<p>Les données sont disponibles <a href='http://fxjollois.github.io/accesdonnees.html' title=''>ici</a></p>
</article></slide><slide class=''><hgroup><h2>SQL sous R</h2></hgroup><article id="sql-sous-r">
<p>Il existe plusieurs librairies permettant de se connecter directement à une base de données (<code>SQLite</code>, <code>MySQL</code>, <code>Oracle</code>, …), et de récupérer le résultat d'une requête exécutée par le SGBD.</p>
<p>La librairie <a href='https://cran.r-project.org/web/packages/sqldf/index.html' title=''><code>sqldf</code></a> permet :</p>
<ul>
<li>de réaliser des opérations SQL sur une base de données existantes, en spécifiant le <em>driver</em> ;</li>
<li>de créer une base de données <em>ex-nihilo</em> (type défini par le <em>driver</em> choisi) ;</li>
<li>de requêter directement les <code>data.frame</code> présent dans R.</li>
</ul>
<pre class = 'prettyprint lang-r'>library(sqldf)
sqldf("SELECT * FROM iris;")</pre>
</article></slide><slide class=''><hgroup><h2>Autrement sous R</h2></hgroup><article id="autrement-sous-r">
<p>Le langage <code>R</code> intègre, de base, un certain nombre d'opérateurs permettant de réaliser les opérations usuelles d'algèbre relationnelle :</p>
<ul>
<li><code>subset</code> : restriction et projection</li>
<li><code>transform</code> : calcul et fonction</li>
<li><code>aggregate</code> : agrégat</li>
<li><code>rbind</code> et <code>merge</code> : opérations ensemblistes</li>
<li><code>merge</code> : jointures</li>
</ul>
<p><em>NB</em> : ne sont présentés ici que les fonctions de base du langage <code>R</code>. Il existe certains packages permettant de réaliser aussi ces mêmes opérations relationnelles.</p>
</article></slide><slide class=''><hgroup><h2>Restriction</h2></hgroup><article id="restriction">
<p>La fonction <code>subset</code> renvoie une <code>data.frame</code> restreinte aux lignes respectant une condition (simple ou complexe) passée en paramètre :</p>
<pre class = 'prettyprint lang-r'>subset(df, subset = condition)</pre>
<p><em>NB</em> : Dans la condition, nous utilisons le nom des variables sans préciser le nom de la table avant.</p>
</article></slide><slide class=''><hgroup><h2>Projection</h2></hgroup><article id="projection">
<p>Nous utilisons ici la même fonction <code>subset</code> que pour la restriction. Il est nécessaire de passer en paramètre la liste des variables à conserver, dans le paramètre <code>keep</code>.</p>
<pre class = 'prettyprint lang-r'>subset(df, select = liste_attributs)</pre>
<p>Pour supprimer les doublons du résultat, de manière identique au <code>DISTINCT</code> en SQL, il faut utiliser la fonction <code>unique</code>.</p>
<pre class = 'prettyprint lang-r'>unique(subset(df, select = liste_attributs))</pre>
</article></slide><slide class=''><hgroup><h2>Calcul et fonction</h2></hgroup><article id="calcul-et-fonction">
<p>Pour tout ce qui est définition de nouvelles variables, nous utilisons la fonction <code>transform</code>, dans laquelle nous décrivons l'expression pour la ou les nouvelles variables.</p>
<pre class = 'prettyprint lang-r'>transform(df, var = expression)</pre>
<p><em>NB</em> : dans l'expression, il est possible d'utiliser les fonctions <code>R</code>.</p>
</article></slide><slide class=''><hgroup><h2>Agrégat</h2></hgroup><article id="agregat">
<p>La fonction <code>aggregate</code> permet de réaliser des opérations d'agrégats sur des <code>data.frames</code>. Dans ce cas, il ne peut y avoir qu'un seul type d'agrégat par utilisation de <code>aggregate</code> (i.e. pour faire deux opérations - par exemple <code>COUNT</code> et <code>SUM</code>, il faut 2 utilisations d'aggregate).</p>
<pre class = 'prettyprint lang-r'># calcul d'agrégat global
aggregate(attribut ~ 1, df, agregat)
# avec regroupement
aggregate(attribut ~ regroupement, df, agregat)
# si plusieurs attributs de regroupement :
aggregate(attribut ~ att1 + att2 + ..., df, agregat)</pre>
<p><em>NB</em> : <code>agregat</code> représente le calcul d'agrégat à effectuer (<code>length</code> pour un dénombrement, <code>sum</code> pour une somme, …).</p>
</article></slide><slide class=''><hgroup><h2>Opérations ensemblistes</h2></hgroup><article id="operations-ensemblistes">
<p>La fonction <code>rbind</code> assemble deux <code>data.frames</code> ensemble l'un <em>au-dessous</em> de l'autre, et dans ce sens fait une <strong>union</strong> complète (toutes les lignes sont présentes, et donc certaines éventuellement en double).</p>
<pre class = 'prettyprint lang-r'>rbind(df1, df2)</pre>
<p>La fonction <code>merge</code> permet de réaliser cela plus proprement et de choisir si on veut une <strong>union</strong> ou une <strong>intersection</strong> (ne fonctionne que si les deux <code>data.frames</code> ont les mêmes colonnes).</p>
<pre class = 'prettyprint lang-r'># Union
merge(df1, df2, all = T)
# Intersection
merge(df1, df2)</pre>
<p>Rien pour réaliser directement une différence.</p>
</article></slide><slide class=''><hgroup><h2>Jointures</h2></hgroup><article id="jointures">
<p>On utilise la même fonction <code>merge</code> pour réaliser les jointures, et les différentes jointures (interne, externe gauche, externe droite ou complète) se spécifient à l'aide des paramètres <code>all</code>, <code>all.x</code> et <code>all.y</code>. Si on veut indiquer les colonnes pour les jointures, il est possible des les spécifier via <code>by</code> et <code>by.x</code>/<code>by.y</code>.</p>
<pre class = 'prettyprint lang-r'># Jointure interne
merge(df1, df2)
# Jointure gauche (droite avec all.y = T)
merge(df1, df2, all.x = T)
# Jointure complète
merge(df1, df2, all = T)
# Jointure en spécifiant les colonnes
merge(df1, df2, by.x = liste_att1, by.y = liste_att2)</pre></article></slide>
<slide class="backdrop"></slide>
</slides>
<script src="libs/ioslides-13.5.1/js/modernizr.custom.45394.js"></script>
<script src="libs/ioslides-13.5.1/js/prettify/prettify.js"></script>
<script src="libs/ioslides-13.5.1/js/prettify/lang-r.js"></script>
<script src="libs/ioslides-13.5.1/js/prettify/lang-yaml.js"></script>
<script src="libs/ioslides-13.5.1/js/hammer.js"></script>
<script src="libs/ioslides-13.5.1/js/slide-controller.js"></script>
<script src="libs/ioslides-13.5.1/js/slide-deck.js"></script>
<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
(function () {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
document.getElementsByTagName("head")[0].appendChild(script);
})();
</script>
<!-- map slide visiblity events into shiny -->
<script>
(function() {
if (window.jQuery) {
window.jQuery(document).on('slideleave', function(e) {
window.jQuery(e.target).trigger('hidden');
});
window.jQuery(document).on('slideenter', function(e) {
window.jQuery(e.target).trigger('shown');
});
}
})();
</script>
</body>
</html>