IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

AJout de colonne à un dataframe + calculs


Sujet :

R

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Physicienne Médicale
    Inscrit en
    Mai 2019
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Physicienne Médicale

    Informations forums :
    Inscription : Mai 2019
    Messages : 32
    Points : 25
    Points
    25
    Par défaut AJout de colonne à un dataframe + calculs
    Bonjour !

    J'ai besoin d'aide pour calculer des colonnes supplémentaires à mon dataframe.

    Voici un exemple en modèle réduit correspondant à mon dataframe réel, avec :
    - une colonne x (numérique)
    - une colonne y (string)
    - une colonne z (numérique)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    x  <-  rnorm(30,mean = 5,sd = 1.5)
    y <- rep (  c("A","B","C","C","A") , 6 )
    z <- rep ( c(1,2,3) , 10 )
    DF <- data.frame (x,y,z)
    Mon but serait de créer 3 colonnes correspondant à :
    - colonne4 : Nombre de y (exemple sur la première ligne, il s'agit du nombre de fois ou apparait "A" dans ma colonne y)
    - colonne5 : La médiane de x par couple y et z (exemple sur la première ligne, on calcule la médiane de x des lignes 1; 10; 16 et 25 où "A" "1" apparaît).
    - colonne6 : le nombre de fois ou apparaissent les couples y et z (exemple sur la première ligne, on calcule le nombre de fois ou le couple "A" ; "1" apparait sur les lignes, c'est à dire 4 fois).

    Voici un tableau excel où je vous montre ce que ça donnerai (j'ai pas rempli toutes les cases) :

    Nom : Capture.JPG
Affichages : 2418
Taille : 70,7 Ko

    Je pense qu'on peut ajouter les colonnes avec cbind mais je ne sais pas comment faire pour calculer les valeurs et les placer dans mes nouvelles colonnes...Merci de votre aide, je cherche depuis ce matin mais mes tests ne fonctionnement pas !

    Matou

  2. #2
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut Calculs par groupe
    Bonjour,

    Vous pouvez calculer les 3 nouvelles colonnes et les merger au dataframe initial :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    df4 <- setNames(aggregate(x ~ y, data = df, FUN = length),c("y","nb_y"))
    df5 <- setNames(aggregate(x ~ y+z, data = df, FUN = median),c("y","z","mediane_x_par_couple_y_z"))
    df6 <- setNames(aggregate(x ~ y+z, data = df, FUN = length),c("y","z","nb_y_z"))
    df <- merge(df,df4,by="y")
    df <- merge(df,df5,by=c("y","z"))
    df <- merge(df,df6,by=c("y","z"))
    df <- cbind(x=df[,3],df[,-3])
    ou en décomposant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    df4 <- aggregate(x ~ y, data = df, FUN = length)
    names(df4) <- c("y","nb_y")
    Cordialement,

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Physicienne Médicale
    Inscrit en
    Mai 2019
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Physicienne Médicale

    Informations forums :
    Inscription : Mai 2019
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    Bonjour mgdondon,

    Merci beaucoup d'avoir pris la peine de comprendre mon problème et de me donner cette solution qui fonctionne à merveille !!!
    Je vais étudier toutes ces fonctions pour les intégrer et m'en resservir plus tard si besoin. (je débute en R).

    A bientôt
    Matou

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Physicienne Médicale
    Inscrit en
    Mai 2019
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Physicienne Médicale

    Informations forums :
    Inscription : Mai 2019
    Messages : 32
    Points : 25
    Points
    25
    Par défaut Apport précision
    Citation Envoyé par mgdondon Voir le message
    Bonjour,

    Vous pouvez calculer les 3 nouvelles colonnes et les merger au dataframe initial :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    df4 <- setNames(aggregate(x ~ y, data = df, FUN = length),c("y","nb_y"))
    df5 <- setNames(aggregate(x ~ y+z, data = df, FUN = median),c("y","z","mediane_x_par_couple_y_z"))
    df6 <- setNames(aggregate(x ~ y+z, data = df, FUN = length),c("y","z","nb_y_z"))
    df <- merge(df,df4,by="y")
    df <- merge(df,df5,by=c("y","z"))
    df <- merge(df,df6,by=c("y","z"))
    df <- cbind(x=df[,3],df[,-3])
    Cordialement,

    Bonsoir,

    En fait le df6 ne me donne pas ce que je souhaite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    df6 <- setNames(aggregate(x ~ y+z, data = df, FUN = length),c("y","z","nb_y_z"))
    Cette fonction donne tous les couples y+z. Je crois que je me suis mal exprimée, même je me suis trompé dans ma demande initiale...

    En fait je souhaiterai obtenir juste le nombre de z differents en fonction des y.

    Ici, df6 donnerait tout simplement :

    y nb_de_z differents

    A 3
    B 3
    C 3

    3 étant le nombre de chiffres z différents qui donnent y. Exemple pour A il y a A1 ; A2 et A3 donc 3 pour A.

    Pour cela, j'ai convertit la liste de mes z en factor (car je pense que le problème vient de là mais je ne suis pas sûre).
    Et j'ai rajouté un caractère pour que ce soit plus explicite, et créé une colonne supplémentaire à mon dataframe.
    Ma liste z correspond à des numéros de centres (lieux).
    Donc elle devient : 1 , 2, 3 => C 1 ; C 2 ; C 3 , avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Centre= DF$z
    DF <- cbind(DF,Centre)
    DF$Centre <- paste("C", DF$Centre ,sep=" ")
    DF$Centre <- as.factor(DF$Centre)
    Mais je ne maîtrise pas encore bien la fonction aggregate, malgré mes tentatives et l'aide en ligne, je n'arive pas à obtenir ma liste y (A, B, C) avec mes nombres de centres differents (de ma nouvelle colonne "Centre") pour chaque y (A, B et C).

    Ce n'est peut être pas la fonction "aggregate" ?
    Toute idée sera la bienvenue, merci

    Matou

  5. #5
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut Nombre de modalités
    Bonjour,

    Vous pouvez utiliser la fonction nlevels() après avoir transformé la variable en factor.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    df$zf <- as.factor(df$z)
    aggregate(zf ~ y, data = df, FUN = nlevels)
    Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajouter des colonnes calculées
    Par CRhodes7 dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/07/2019, 09h01
  2. Ajout de colonne calculée entre 2 entrées d'un crosstab
    Par darealtrambert dans le forum iReport
    Réponses: 1
    Dernier message: 03/09/2012, 17h30
  3. Réponses: 1
    Dernier message: 22/08/2012, 19h11
  4. Ajouter une colonne à un fichier csv contenant les resultats d'un calcul
    Par Freedd dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 31/07/2008, 12h01
  5. Calcul sql, jointure, ajout de colonne
    Par stelsej dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/04/2007, 17h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo