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 :

Soustraire deux valeurs et compiler les résultats.


Sujet :

R

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 39
    Points : 22
    Points
    22
    Par défaut Soustraire deux valeurs et compiler les résultats.
    Bonjour à tous,

    Je dispose d'un jeu de fichiers csv (colonnes séparés par des virgules) tous contenu dans un même répertoire. Je souhaiterais dans chacun de ces fichiers, soustraire la case D4 avec D3. (=D4-D3). En clair, il s'agit de la 4eme et 3eme ligne de la 4eme colonne.
    Puis, je souhaiterais compiler tous ces résultats sous la forme :
    |nom du fichier 1|valeur obtenue|
    |nom du fichier 2|valeur obtenue|...

    Pour cela je pense que le début du code dans R doit être ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    setwd("C:REPERTOIRE")
    liste_fichiers <- list.files(pattern="csv")
    n=length(liste_fichiers)
    dftot=data.frame()
    Pour la suite, je ne sais pas trop...

    Pourriez-vous m'aider ?

    Merci par avance

  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 Soustraire deux valeurs et compiler les résultats
    Bonjour fanfanus,

    Pour la suite, je ne sais pas trop...
    Il faut procéder pas à pas. Commencez par calculer D4-D3 sur un fichier. Vous pourrez ensuite boucler sur les fichiers.

    Cordialement,

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    Un truc comme ça...?
    (je ne sais pas trop, je débute.. )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dim(test)
    test[4,4]-test[3,4]

  4. #4
    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 Soustraire deux valeurs et compiler les résultats
    Bonjour,

    Oui, c'est très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    > df <- data.frame(V1 = c(1,4,6,3), V2 = c(4,-1,3,2), V3 = c(4,-4,-2,1), V4 = c(3,9,8,10))
    > df
      V1 V2 V3 V4
    1  1  4  4  3
    2  4 -1 -4  9
    3  6  3 -2  8
    4  3  2  1 10
    > df[4,4]-df[3,4]
    [1] 2
    Maintenant vous pouvez essayer de boucler sur les fichiers sur le modèle de votre précédent message.

    Cordialement,

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    J'ai essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    setwd("C:/Users/fanfa/Desktop/data_csv_Rm/temps")
    liste_fichiers <- list.files(pattern="csv")
    n=length(liste_fichiers)
    dftot=data.frame()
    for (i in 1:n) 
      {
      df <- read.csv(liste_fichiers[i])
      df[4,4]-df[3,4]
      }
    dftot
    write.table(dftot,file="myval.txt")
    Mais j'obtiens ce message d'erreur :
    Error in read.table(file = file, header = header, sep = sep, quote = quote, : plus de colonnes que de noms de colonnes
    Voici un de mes fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    EVENTS
    Subject,Context,Name,Time (s),Description
    AA01,General,Foot Strike,1.400000,The instant the heel strikes the ground
    AA01,General,Foot Off,4.470000,The instant the toe leaves the ground
    AA01,General,Event,5.170000,A general (unspecified) event
    AA01,General,Event,5.410000,A general (unspecified) event
    C'est peut-être la ligne 1 qui bloque ?

  6. #6
    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 Soustraire deux valeurs et compiler les résultats
    Bonjour,

    Oui, c'est la ligne 1 qui bloque. Les noms de variables sont en ligne 2. Vous pouvez utiliser l'option skip=1 pour ignorer la première ligne.

    Une étape intermédiaire avant de faire la boucle est de tester votre programme sur deux fichiers.

    Cordialement,

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    J'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    setwd("C:/Users/fanfa/Desktop/data_csv_Rm/test")
    liste_fichiers <- list.files(pattern="csv")
    n=length(liste_fichiers)
    dftot=data.frame()
    for (i in 1:n) 
       {
       df <- read.csv(liste_fichiers[i], skip=1)
       df[4,4]-df[3,4]
       }
    dftot
    J'obtiens ça :
    data frame with 0 columns and 0 rows
    (idem avec skip=2)
    Ce qui est assez déconcertant !

  8. #8
    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 Soustraire deux valeurs et compiler les résultats
    C'est normal, regardez bien votre précédent message.

    Un indice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    > dftot=data.frame()
    > dftot
    data frame with 0 columns and 0 rows
    Si vous ne voyez pas, passez par une étape intermédiaire sur deux fichiers sans faire de boucle.

    Cordialement,

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    Alors, suivant tes conseils, j'ai commencé par ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    df <- read.csv("C:/Users/fanfa/Desktop/data_csv_Rm/test/AA01_M1.csv", skip=1)
       df[4,4]-df[3,4]
    Et là ça fonctionne, mais je me rends compte que le résultat n'est pas le bon. En effet, à priori il supprimer la ligne ignorée et la ligne d'entête.
    Donc je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    df <- read.csv("C:/Users/fanfa/Desktop/data_csv_Rm/test/AA01_M1.csv", skip=1)
       df[2,4]-df[1,4]
    Et là ça marche.

    Reste donc a réintégrer ça dans la boucle.
    Je suppose qu'il faut rajouter le skip dans cette ligne : , mais malgré plusieurs essais je ne ne parviens pas à quelque chose qui fonctionne. J'ai tenté également avec un truc de ce genre ; sans succès.

    Comment procéder ?

    Merci pour votre aide.

  10. #10
    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 Soustraire deux valeurs et compiler les résultats
    Bonjour,

    1) En effet, le nom des variables constituent la structure du dataframe et les données son contenu. Il est donc normal que le numéro d'observation du dataframe ne corresponde pas au numéro de ligne dans le fichier Excel.

    Lorsque vous importez un fichier, vous pouvez vérifier que l'import s'est bien passé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    > str(df)
    'data.frame':   4 obs. of  5 variables:
     $ Subject    : Factor w/ 1 level "AA01": 1 1 1 1
     $ Context    : Factor w/ 1 level "General": 1 1 1 1
     $ Name       : Factor w/ 3 levels "Event","Foot Off",..: 3 2 1 1
     $ Time..s.   : num  1.4 4.47 5.17 5.41
     $ Description: Factor w/ 3 levels "A general (unspecified) event",..: 2 3 1 1
    > head(df)
      Subject Context        Name Time..s.                             Description
    1    AA01 General Foot Strike     1.40 The instant the heel strikes the ground
    2    AA01 General    Foot Off     4.47   The instant the toe leaves the ground
    3    AA01 General       Event     5.17           A general (unspecified) event
    4    AA01 General       Event     5.41           A general (unspecified) event
    2) Je reprends votre code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    setwd("C:/Users/fanfa/Desktop/data_csv_Rm/test")
    liste_fichiers <- list.files(pattern="csv")
    n=length(liste_fichiers)
    dftot=data.frame()
    for (i in 1:n) 
       {
       df <- read.csv(liste_fichiers[i], skip=1)
       df[2,4]-df[1,4]
       }
    dftot
    Vous avez initialisé votre dataframe dftot=data.frame() et l'avez affiché dftot mais ne l'avez pas modifié entre temps.

    Comparez avec le code de votre autre message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    library(plyr)
    setwd("D:/data")
    liste_fichiers <- list.files(pattern="csv")
    n=length(liste_fichiers)
    dftot=data.frame()
    for (i in 1:n) 
      {
      df <- read.csv(liste_fichiers[i])
      mean_fichier <- data.frame(lapply(df,mean))
      dftot <- rbind.fill(dftot, mean_fichier)
      }
    dftot
    Cordialement,

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    Désolé si je suis un peu neuneu...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Setwd("C:/Users/fanfa/Desktop/data_csv_Rm/test")
    liste_fichiers <- list.files(pattern="csv")
    n=length(liste_fichiers)
    dftot=data.frame()
    for (i in 1:n) 
       {
       df <- read.csv(liste_fichiers)
       soustraction <- data.frame(lapply(df[-1,],df[2,4]-df[1,4])
       dftot <- rbind.fill(df, soustraction)
       }
    dftot
    Je pense que la syntaxe de lapply ne va pas.

  12. #12
    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 Soustraire deux valeurs et compiler les résultats
    C'est en forgeant qu'on devient forgeron...

    lapply() servait à appliquer la même opération sur toutes les colonnes de votre fichier.

    Ici, c'est plus simple puisque vous n'avez qu'une opération à faire.

    Avec deux dataframes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    > df1 <- data.frame(V1 = c(1,4,6,3), V2 = c(4,-1,3,2), V3 = c(4,-4,-2,1), V4 = c(3,9,8,10))
    > df2 <- data.frame(V1 = c(4,-1,3,2), V2= c(4,-4,-2,1), V3 = c(3,9,8,10), V4 = c(1,4,6,3))
    > df1
      V1 V2 V3 V4
    1  1  4  4  3
    2  4 -1 -4  9
    3  6  3 -2  8
    4  3  2  1 10
    > df2
      V1 V2 V3 V4
    1  4  4  3  1
    2 -1 -4  9  4
    3  3 -2  8  6
    4  2  1 10  3
    > 
    > diff1 = data.frame(diff=df1[4,4]-df1[3,4])
    > diff2 = data.frame(diff=df2[4,4]-df2[3,4])
    > 
    > library(plyr)
    > rbind.fill(diff1, diff2)
      diff
    1    2
    2   -3
    Cordialement,

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    Merci de votre patience,

    Je ne comprend pas pourquoi cette expression n'est pas bonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    read.csv(liste_fichiers[i], skip=1)

  14. #14
    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 Soustraire deux valeurs et compiler les résultats
    Pourquoi dites-vous que l'instruction n'est pas bonne ?

    J'ai donné un exemple sur deux dataframes mais ça revient au même : la fonction read.csv() permet d'importer le contenu de votre fichier dans un dataframe.

    Cordialement,

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    J'ai trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    library(plyr)
    setwd("C:/Users/fanfa/Desktop/data_csv_Rm/temps")
    liste_fichiers <- list.files(pattern="csv")
    n=length(liste_fichiers)
    diff=data.frame()
    for (i in 1:n) 
       {
       df <- read.csv(liste_fichiers[i], skip=1)
       diff <- rbind.fill(diff, data.frame(df[2,4]-df[1,4]))
       }
    diff
    Pour finir, je veux rajouter le nom du fichier pour chaque ligne.
    Il faut créer une autre data.frame avec dedans "liste_fichiers" ?
    J'ai tenté ça, sans succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    df1 <-- data.frame(liste_fichiers)
       diff <- rbind.fill(diff, df1, data.frame(df[2,4]-df[1,4]))
       }
    Merci déjà pour m'avoir fait avancé jusque là !

  16. #16
    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 Soustraire deux valeurs et compiler les résultats
    Regardez à nouveau votre autre message. Vous aviez terminé par la même question.

    Cordialement,

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    > library(plyr)
    > setwd("C:/Users/fanfa/Desktop/data_csv_Rm/temps")
    > liste_fichiers <- list.files(pattern="csv")
    > n=length(liste_fichiers)
    > diff=data.frame()
    > for (i in 1:n) 
    +    {
    +    df <- read.csv(liste_fichiers[i], skip=1)
    +    df1 <-- data.frame(df[2,4]-df[1,4])
    +    df2 <-- data.frame(fichier=liste_fichiers[i], df1)
    +    diff <- rbind.fill(diff, df2)
    +    }
    There were 50 or more warnings (use warnings() to see the first 50)
    > diff
    Ne fonctionne pas non plus comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       df <- read.csv(liste_fichiers[i], skip=1)
       df1 <-- data.frame(fichier=liste_fichiers[i], df[2,4]-df[1,4])
       diff <- rbind.fill(diff, df1)
    Pourtant, j'ai l'impression de respecter le même principe que l'autre code ?

  18. #18
    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 Soustraire deux valeurs et compiler les résultats
    Oui, vous y êtes presque.

    Si on reprend mon exemple sur deux fichiers,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    > df1 <- data.frame(V1 = c(1,4,6,3), V2 = c(4,-1,3,2), V3 = c(4,-4,-2,1), V4 = c(3,9,8,10))
    > df2 <- data.frame(V1 = c(4,-1,3,2), V2= c(4,-4,-2,1), V3 = c(3,9,8,10), V4 = c(1,4,6,3))
    > df1
      V1 V2 V3 V4
    1  1  4  4  3
    2  4 -1 -4  9
    3  6  3 -2  8
    4  3  2  1 10
    > df2
      V1 V2 V3 V4
    1  4  4  3  1
    2 -1 -4  9  4
    3  3 -2  8  6
    4  2  1 10  3
    Voici le code que je vous ai proposé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > diff1 = data.frame(diff=df1[4,4]-df1[3,4])
    > diff2 = data.frame(diff=df2[4,4]-df2[3,4])
    > 
    > library(plyr)
    > rbind.fill(diff1, diff2)
      diff
    1    2
    2   -3
    et celui que vous avez exécuté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > diff1 = data.frame(df1[4,4]-df1[3,4])
    > diff2 = data.frame(df2[4,4]-df2[3,4])
    > 
    > library(plyr)
    > rbind.fill(diff1, diff2)
      df1.4..4....df1.3..4. df2.4..4....df2.3..4.
    1                     2                    NA
    2                    NA                    -3
    Ici on est obligé d'ajouter le nom de la variable créée parce qu'on ne passe pas par une fonction.

    Cordialement,

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    Une fois la variable nommée, j'obtiens ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    library(plyr)
    setwd("C:/Users/fanfa/Desktop/data_csv_Rm/temps")
    liste_fichiers <- list.files(pattern="csv")
    n=length(liste_fichiers)
    diff=data.frame()
    for (i in 1:n) 
       {
        df <- read.csv(liste_fichiers[i], skip=1)
        df1 <-- data.frame(durée=df[2,4]-df[1,4])
        df2 <-- data.frame(fichier=liste_fichiers[i], df1)
        diff <- rbind.fill(diff, df2)
       }
    diff
    et le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    There were 50 or more warnings (use warnings() to see the first 50)
    > diff
        fichier    durée
    1        NA 3.070000
    2        NA 2.300000
    3        NA 2.410000...
    J'ai l'impression que c'est ça qui bug :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichier=liste_fichiers[i]
    Pourtant..?

  20. #20
    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 Soustraire deux valeurs et compiler les résultats
    C'est que vous avez utilisé <-- au lieu de <-.

    Par ailleurs je vous conseille de ne pas mettre d'accents dans les noms de variables.

    Enfin, je pense que le programme serait plus lisible avec votre deuxième notation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df1 <- data.frame(fichier=liste_fichiers[i], duree=df[2,4]-df[1,4])
    Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [2008] Soustraire les résultats de deux requêtes
    Par demerius dans le forum Développement
    Réponses: 2
    Dernier message: 04/11/2014, 16h11
  2. Réponses: 2
    Dernier message: 24/06/2009, 22h38
  3. [EJBQL] Requête avec une valeur constante dans les champs résultat
    Par adamo901 dans le forum Java EE
    Réponses: 1
    Dernier message: 13/04/2009, 00h32
  4. Regroupement de deux tables avec juste les valeurs identiques
    Par ange_dragon dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 04/07/2007, 15h42
  5. Réponses: 1
    Dernier message: 28/06/2005, 09h15

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