Tableau croisé dynamique R

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

alexandre cavasino
Messages : 34
Enregistré le : 13 Juin 2017, 08:14

Tableau croisé dynamique R

Messagepar alexandre cavasino » 19 Juin 2017, 15:43

Bonjour à toutes et à tous.
Je dispose d'une base de donnée (Data) qui a la forme suivante (2 variables : Nom et Achat) :
le nom est composé d'une lettre et l'achat d'un ou plusieurs chiffres en euro
    Nom Achat
    A 10
    A 9
    A 10
    A 9
    B 5
    B 4
    B 5
    C 11
    C 2
    C 7


Je souhaiterai obtenir un tableau de la forme

    A 10 9 10 9
    B 5 4 5
    C 11 2 7
    A 10 9 10 9

J'ai déjà réalisé sur SAS ce type de procédure en faisant un group by nom, seulement sur R je n'ai pas la moindre idée de comment cela fonctionne

autrement dit un tableau avec en ligne les noms et en Volonne l'ensemble des achats.
Merci d'avance pour votre aide

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Tableau croisé dynamique R

Messagepar Gabriel Terraz » 19 Juin 2017, 18:00

Salut,
Tu n'as pas autant d'achats pour chaque lettre, sauf erreur de ma part tu ne pourras pas utiliser un tableau. Soit il faut utiliser une liste, soit c'est ton extrait qui ne reflète pas exactement les données. Dans ce cas tu pourrai faire :

Code : Tout sélectionner

df <- data.frame(nom = factor(rep(LETTERS[1:3],each = 3)), Achat = sample(20,9)) ## Données bidon

Code : Tout sélectionner

as.data.frame(t(unstack(df, Achat ~ nom)))
  V1 V2 V3
A  3  1 17
B  6  4 19
C 15  7 10

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Tableau croisé dynamique R

Messagepar Logez Maxime » 20 Juin 2017, 08:50

Bonjour,

une possibilité :

Code : Tout sélectionner

df$Nachat <- ave(as.character(df$Nom), df$Nom, FUN = function(x) sprintf("Achat%s", seq_along(x)))
library(reshape2)
dcast(df, Nom ~ Nachat, value.var = "Achat")
  Nom Achat1 Achat2 Achat3 Achat4
1   A     10      9     10      9
2   B      5      4      5     NA
3   C     11      2      7     NA
library(tidyr)
spread(df, Nachat, Achat)
Cordialement,
Maxime

alexandre cavasino
Messages : 34
Enregistré le : 13 Juin 2017, 08:14

Re: Tableau croisé dynamique R

Messagepar alexandre cavasino » 22 Juin 2017, 14:45

Merci pour votre réponse. Cela marche très bien. En revanche imaginons qu'à la place des achats nous ayons des dates au format "YYYY-MM-DD"
car il peut y avoir des achats a plusieurs dates différentes.
J'ai donc reprit votre code :

df$Ndate <- ave(as.character(df$Nom), df$Nom, FUN = function(x) sprintf("date%s", seq_along(x))) # date est la variable qui remplace prime
dcast(df, Nom ~ Ndate, value.var = "date")

Le soucis est que dans mon résultat j'obtiens des dates du genre "1010444400" alors qu'en réalité je souhaiterai l'obtenir comme elle est définie dans la table df (YYYY-MM-DD)

Bonne journée à vous

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Tableau croisé dynamique R

Messagepar Logez Maxime » 22 Juin 2017, 14:55

Bonjour,

je transformerais les dates d'un format date (ou POSIXct) à un format chaîne de caractère :

Code : Tout sélectionner

df$date <- format(df$date, format = "%Y-%m-%d")
df2 <- dcast(df, Nom ~ Ndate, value.var = "date")
# et si besoin de date au format date :
require(dplyr)
df2 %>% mutate_if(is.character, funs(as.Date))

Cordialement,
Maxime

alexandre cavasino
Messages : 34
Enregistré le : 13 Juin 2017, 08:14

Re: Tableau croisé dynamique R

Messagepar alexandre cavasino » 23 Juin 2017, 09:23

Merci beaucoup pour votre aide. Il y a juste un petit soucis. Les dates en questions affiché désormais en ligne ne sont pas trié par nom.
j'ai par exemple sur une ligne :

A 2004-05-31 2002-06-22 2010-02-13

alors que je voudrais obtenir :

A 2002-06-22 2004-05-31 2010-02-13

Merci d'avance pour votre aidé. J'ai essayé de faire un order par la date sur la base initiale seulement cela trie toute les dates donc ca ne fonctionne pas vraiment.

Bien cordialement,
Alexandre cavasino

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Tableau croisé dynamique R

Messagepar Logez Maxime » 23 Juin 2017, 09:31

Bonjour,

normal il te faut ordonner les données par Nom puis par date avant de faire les autres manips :

Code : Tout sélectionner

df <- df[do.call(order, df[c("Nom", "date")]),]
Cordialement,
Maxime

alexandre cavasino
Messages : 34
Enregistré le : 13 Juin 2017, 08:14

Re: Tableau croisé dynamique R

Messagepar alexandre cavasino » 26 Juin 2017, 15:41

Merci beaucoup pour votre aide. Le soucis est que lorsque je visionne ma nouvelle table et que je fais une recherche sur un nom
df[df$nom == A] par exemple.
Il y a bien en colonne le numéro de la date seulement il en manque et j'obtient ceci :

Nom date1 date10 date100 date101 date101 date102 date11 ...



Il faudra que ce soit dans l'ordre. De plus je n'arrive pas a voir les dates entre 1 et 10 sachant que pour les dates : date100 , date101 ,date102 je n'ai pas de date ce qui est normal vu que pour ce nom il n'y a normalement que 11 dates.

J'esepere avoir été clair.
Merci d'avance


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité