R
- STID 2ème annéeOn choisit donc ici d’afficher le code, et faire en sorte que les tableaux soient affichés au format HTML, grâce à la fonction kable()
de la librairie knitr
.
ca = read.table("../donnees/ca/ca.txt", sep = "%", header = T)
groupe = read.table("../donnees/ca/groupe.txt", sep = "%", header = T, quote = NULL)
mois = read.table("../donnees/ca/mois.txt", sep = "%", header = T)
provenance = read.table("../donnees/ca/provenance.txt", sep = "%", header = T)
En décomposant les étapes :
# Jointure entre ca et provenance
etape1 = merge(ca, provenance, by.x = "prov_no", by.y = "no")
# Jointure du résultat avec groupe
etape2 = merge(etape1, groupe, by.x = "groupe_no", by.y = "no")
# Enfin, jointure du résultat précédent avec mois
ca_tout_bis = merge(etape2, mois, by.x = "mois_no", by.y = "no")
Tout dans la même expression, sans création de variables temporaires :
# Remplacement de chaque var temporaire par son calcul
# Le code est indenté pour plus de clarté
ca_tout = merge(
merge(
merge(
ca,
provenance,
by.x = "prov_no", by.y = "no"
),
groupe,
by.x = "groupe_no", by.y = "no"
),
mois,
by.x = "mois_no", by.y = "no"
)
On vérifie que nous obtenons bien évidemment les mêmes data.frame
s :
identical(ca_tout, ca_tout_bis)
## [1] TRUE
Ici, on part du data.frame
ca_tout
précédemment créé, pour en créer deux (un pour 2003, et un pour 2004), puis on fait une jointure entre les deux, sur tous les attributs en commun sauf no
et mois_no
.
Idem, en décomposant chaque étape :
# Partie 2003
# - restriction à l'année 2003
evol2003a = subset(ca_tout, annee == 2003)
# - création d'une nouvelle variable ca2003 pour l'utiliser plus tard
evol2003b = transform(evol2003a, ca2003 = ca)
# - supression des variables inutiles : ca, annee, no, mois_no
evol2003c = subset(evol2003b, select = -c(ca, annee, no, mois_no))
# Partie 2004
# - restriction à l'année 2004
evol2004a = subset(ca_tout, annee == 2004)
# - création d'une nouvelle variable ca2004 pour l'utiliser plus tard
evol2004b = transform(evol2004a, ca2004 = ca)
# - supression des variables inutiles : ca, annee, no, mois_no
evol2004c = subset(evol2004b, select = -c(ca, annee, no, mois_no))
# Jointure entre les deux parties, sur tous les attributs en commun, sauf
evol = merge(
evol2003c,
evol2004c,
by = c("prov_no", "code_prov", "provenance",
"groupe_no", "code_dep", "departement",
"code_groupe", "groupe", "code_sgroupe", "sous_groupe",
"mois", "mois_numero")
)
ca_evol_bis = transform(evol, evolution = ca2004 - ca2003)
Et en réalisant tout en une fois :
ca_evol = transform(
merge(
subset(transform(subset(ca_tout, annee == 2003), ca2003 = ca),
select = -c(ca, annee, no, mois_no)),
subset(transform(subset(ca_tout, annee == 2004), ca2004 = ca),
select = -c(ca, annee, no, mois_no)),
by = c("prov_no", "code_prov", "provenance",
"groupe_no", "code_dep", "departement",
"code_groupe", "groupe", "code_sgroupe", "sous_groupe",
"mois", "mois_numero")
),
evolution = ca2004 - ca2003
)
On obtient bien le même résultat :
identical(ca_evol, ca_evol_bis)
## [1] TRUE
Dans cette deuxième version, on repart des data.frame
s de base, pour déjà séparer 2003 et 2004, puis faire les jointures entre les deux. Puis, au final, faire la jointure avec provenance
et groupe
.
En décomposant :
autre1 = merge(ca, mois, by.x = "mois_no", by.y = "no")
autre2003a = subset(autre1, annee == 2003)
autre2003b = transform(autre2003a, ca2003 = ca)
autre2003c = subset(autre2003b, select = -c(ca, annee, no, mois_no))
autre2004a = subset(autre1, annee == 2004)
autre2004b = transform(autre2004a, ca2004 = ca)
autre2004c = subset(autre2004b, select = -c(ca, annee, no, mois_no))
autre2 = merge(autre2003c, autre2004c)
autre3 = merge(autre2, provenance, by.x = "prov_no", by.y = "no")
autre4 = merge(autre3, groupe, by.x = "groupe_no", by.y = "no")
ca_autre_bis = transform(autre4, evolution = ca2004 - ca2003)
Et en minimisant les créations de variables temporaires :
ca_autre = transform(
merge(
merge(
merge(
subset(
transform(
subset(
merge(ca, mois, by.x = "mois_no", by.y = "no"),
annee == 2003
),
ca2003 = ca
),
select = -c(ca, annee, no, mois_no)
),
subset(
transform(
subset(
merge(ca, mois, by.x = "mois_no", by.y = "no"),
annee == 2004
),
ca2004 = ca
),
select = -c(ca, annee, no, mois_no)
)
),
provenance,
by.x = "prov_no", by.y = "no"
),
groupe, by.x = "groupe_no", by.y = "no"),
evolution = ca2004 - ca2003
)
On regarde qu’on obtient bien le même résultat
identical(ca_autre, ca_autre_bis)
## [1] TRUE
Ici, on ne peut pas utiliser identical()
car l’ordre n’est pas le même entre les deux résultat, dû à la différence de création (principalement, l’ordre des jointures). On va donc créer un nouvel attribut dans chaque table, composé de mois_numero
, groupe_no
et de prov_no
. On pourra ainsi ordonner les tables grâce à cet attribut (grâce à order()
), et ainsi les comparer. On devra aussi renommer les noms des lignes et réordonner les variables du deuxième data.frame
pour les mettre dans le même ordre que le premier.
# Création d'un df pour ca_evol
# - création de l'attribut ordre
comp1 = transform(ca_evol, ordre = paste(mois_numero, groupe_no, prov_no, sep = "-"))
# - ordonnencement de la table par cet attribut
comp1 = comp1[order(comp1$ordre),]
# - modification des noms de lignes
rownames(comp1) = 1:nrow(comp1)
# Création d'un df pour ca_autre
# - création de l'attribut ordre
comp2 = transform(ca_autre, ordre = paste(mois_numero, groupe_no, prov_no, sep = "-"))
# - ordonnencement de la table par cet attribut
# - ordonnencement des colonnes par l'ordre des colonnes de comp1
comp2 = comp2[order(comp2$ordre), names(comp1)]
# - modification des noms de lignes
rownames(comp2) = 1:nrow(comp2)
# Test pour savoir si ce sont les mêmes tables
identical(comp1, comp2)
## [1] TRUE
kable(aggregate(ca ~ 1, ca_tout, sum))
140999800
kable(aggregate(ca ~ provenance, ca_tout, sum))
provenance | ca |
---|---|
Boutique | 14301803 |
Commandes téléphoniques | 14412893 |
Expo | 14193269 |
Magasin | 14171411 |
Par correspondance | 13794410 |
Revetement de sol professionnel | 13973790 |
Studio Photo | 14110981 |
Studio Radio TV | 13906983 |
Vente aux employés | 13982962 |
Zürich | 14151298 |
kable(aggregate(ca ~ annee, ca_tout, sum))
annee | ca |
---|---|
2003 | 70247370 |
2004 | 70752430 |
mois_numero
kable(subset(aggregate(ca ~ mois + mois_numero, ca_tout, sum), select = -mois_numero))
mois | ca |
---|---|
Janvier | 11750665 |
Février | 11514327 |
Mars | 11885814 |
Avril | 11738956 |
Mai | 11651719 |
Juin | 11861857 |
Juillet | 11771167 |
Août | 11779044 |
Septembre | 11793003 |
Octobre | 11653374 |
Novembre | 11740504 |
Décembre | 11859371 |
mois
, ca2003
, ca2004
, evolution
Dans cette première version, on utilise la table ca_evol
créée précédemment :
kable(subset(aggregate(cbind(ca2003, ca2004, evolution) ~ mois + mois_numero,
ca_evol, sum),
select = -mois_numero))
mois | ca2003 | ca2004 | evolution |
---|---|---|---|
Janvier | 5799948 | 5950717 | 150768.80 |
Février | 5707996 | 5806331 | 98334.70 |
Mars | 5976362 | 5909451 | -66911.20 |
Avril | 5896256 | 5842700 | -53555.71 |
Mai | 5794095 | 5857624 | 63528.60 |
Juin | 5900512 | 5961345 | 60832.30 |
Juillet | 5853953 | 5917214 | 63260.61 |
Août | 5908039 | 5871005 | -37034.49 |
Septembre | 5825065 | 5967938 | 142872.50 |
Octobre | 5748651 | 5904723 | 156071.60 |
Novembre | 5896407 | 5844097 | -52309.72 |
Décembre | 5940084 | 5919286 | -20797.80 |
Dans la deuxième version, on utilise la table ca_tout
créée en premier :
kable(
transform(
setNames(
subset(
merge(
aggregate(ca ~ mois + mois_numero,
subset(ca_tout, annee == 2003), sum),
aggregate(ca ~ mois + mois_numero,
subset(ca_tout, annee == 2004), sum),
by = c("mois_numero")
),
select = -c(mois_numero, mois.y)
),
c("mois", "ca2003", "ca2004")
),
evolution = ca2004 - ca2003
)
)
mois | ca2003 | ca2004 | evolution |
---|---|---|---|
Janvier | 5799948 | 5950717 | 150768.80 |
Février | 5707996 | 5806331 | 98334.70 |
Mars | 5976362 | 5909451 | -66911.20 |
Avril | 5896256 | 5842700 | -53555.71 |
Mai | 5794095 | 5857624 | 63528.60 |
Juin | 5900512 | 5961345 | 60832.30 |
Juillet | 5853953 | 5917214 | 63260.61 |
Août | 5908039 | 5871005 | -37034.49 |
Septembre | 5825065 | 5967938 | 142872.50 |
Octobre | 5748651 | 5904723 | 156071.60 |
Novembre | 5896407 | 5844097 | -52309.72 |
Décembre | 5940084 | 5919286 | -20797.80 |