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 :

écrire à la fin d'un fichier ou stocker des variables de dimensions différentes


Sujet :

R

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Par défaut écrire à la fin d'un fichier ou stocker des variables de dimensions différentes
    Bonjour à tous,

    Je cherche dans 2 fichiers des informations, que je recopie dans un fichier résultat et ce, plusieurs fois. Mais le nombre d'informations (lignes) à recopier n'est pas le même à chaque fois, ce qui fait -il me semble- que je ne peux stocker les informations nulle part et que je dois les écrire au fur et à mesure.
    Je n'ai pas trouvé comment faire avec write... Existe-t-il une commande qui permette de faire cela ?

    Voici le code que j'ai écris pour le moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    donnees_hm1_gene=donnees_hm1_gene[,c(1,6:10)]
    donnees_initiales=donnees_initiales[,c(1,8,9,10,13,14)] 
     
    for (i in 1:length(donnees_hm1_gene) )
    {
    ind=grep(gsub(" ","",donnees_hm1_gene[i,1]),gsub(" ","",donnees_initiales[,1]))
    }
     
    a_ecrire=rbind(donnees_hm1_gene[i,], donnees_initiales[ind,] )
     
    write.table(a_ecrire,file="Code/analyse_diff_iso/resume_up.txt",sep="\t", quote=FALSE, row.names=FALSE, col.names=TRUE)
    Avec le résultat obtenu dans le fichier résultat pour 2 itérations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    test_id	value_1	value_2	ln.fold_change.	q_value	significant
    EHI_180390	0.285594	103.004	5.88795	0	yes
    EHI_180390.ref	0.28377	100.327	5.86803	0	yes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    test_id	value_1	value_2	ln.fold_change.	q_value	significant
    EHI_070680	0.576131	1192.2	7.63498	0	yes
    EHI_070680.alt1	0.253142	0.676848	0.983497	0.362647	no
    EHI_070680.ref	0.352009	1204.61	8.13801	0	yes
    Je souhaite écrire ces deux résultats à la suite, dans un seul fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    test_id	value_1	value_2	ln.fold_change.	q_value	significant
    EHI_180390	0.285594	103.004	5.88795	0	yes
    EHI_180390.ref	0.28377	100.327	5.86803	0	yes
    EHI_070680	0.576131	1192.2	7.63498	0	yes
    EHI_070680.alt1	0.253142	0.676848	0.983497	0.362647	no
    EHI_070680.ref	0.352009	1204.61	8.13801	0	yes
    Voyez-vous une solution ?
    Merci

  2. #2
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Par défaut
    Bonjour,

    Je ne suis pas bien sûre de comprendre ce que vous souhaitez faire... Cependant, si les éléments que vous concaténez avec un "rbind" ont le même nombre de colonnes, normalement il n'y aura pas de problème pour les écrire ensuite dans un fichier à l'aide de la commande "write.table".

    A première vue comme ça, il me semble que le problème viendrait plutôt de votre boucle. En effet, à chaque passage dans la boucle, j'ai l'impression que vous écrasez le contenu de "ind" et non que vous le concaténez, comme c'est ce qu'il me semble que vous souhaitez faire.
    Est-ce que ceci fonctionne mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ind<-NULL
     
    for (i in 1:length(donnees_hm1_gene) )
    {
        ind<-c( ind , grep(gsub(" ","",donnees_hm1_gene[i,1]),gsub(" ","",donnees_initiales[,1])) )
    }
     
    a_ecrire=rbind(donnees_hm1_gene[i,], donnees_initiales[ind,] )
     
    write.table(a_ecrire,file="Code/analyse_diff_iso/resume_up.txt",sep="\t", quote=FALSE, row.names=FALSE, col.names=TRUE)
    Bonne continuation


    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Par défaut
    Merci pour votre réponse.
    Ceci ne correspond pas tout à fait à ce que je veux faire. Je suis d'accord qu'ainsi je peux sauvegarder les indices des lignes que je veux conserver dans un seul (et non les 2) de mes fichiers.

    Mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    a_ecrire=rbind(donnees_hm1_gene[i,], donnees_initiales[ind,] )
    ne me permet pas de conserver l'information sur l'endroit où insérer les lignes du premier fichier...

    Voici ce que contiennent mes fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    > head(donnees_hm1_gene)
         test_id   value_1   value_2 ln.fold_change.   q_value significant
    1 EHI_039600 0.0000000   13.9942    1.79769e+308 0.0367975         yes
    2 EHI_067090 0.3198120 1095.5300     8.13901e+00 0.0000000         yes
    3 EHI_039590 0.0602808  187.7370     8.04378e+00 0.0000000         yes
    4 EHI_070680 0.5761310 1192.2000     7.63498e+00 0.0000000         yes
    5 EHI_098200 1.3283900  480.0840     5.88999e+00 0.0000000         yes
    6 EHI_180390 0.2855940  103.0040     5.88795e+00 0.0000000         yes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    > head(donnees_initiales)
              test_id    value_1     value_2 ln.fold_change.  q_value significant
    1  EHI_000010.ref   17.59890   37.236400       0.7494500 0.276241          no
    2 EHI_000130.alt1    3.66554    0.841157      -1.4719500 0.249410          no
    3  EHI_000130.ref 2258.98000  951.299000      -0.8648400 0.174267          no
    4  EHI_000240.ref 1126.15000 1170.940000       0.0390003 0.968965          no
    5  EHI_000250.ref  281.51100  175.768000      -0.4710080 0.436076          no
    6 EHI_000290.alt1    1.64985    2.792290       0.5261810 0.563960          no
    Je souhaite récupérer les lignes dans "donnees_initiales" qui correspondent à chaque ligne dans donnees_hm1_gene et les afficher à la suite pour regrouper les informations.

    Le fichier sera donc de la sorte :
    1 ligne de donnees_hm1_gene.
    2lignes de donnees_initiales
    1 ligne de donnees_hm1_gene.
    1 ligne de donnees_initiales
    1 ligne de donnees_hm1_gene.
    3lignes de donnees_initiales
    ...
    Sans savoir à l'avance combien il y aura de lignes dans donnees_hm1_gene

    Comme dans cet exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    test_id	value_1	value_2	ln.fold_change.	q_value	significant
    EHI_180390	0.285594	103.004	5.88795	0	yes (fichier donnees_hm1_gene)
    EHI_180390.ref	0.28377	100.327	5.86803	0	yes (fichier donnees_initiales)
    EHI_070680	0.576131	1192.2	7.63498	0	yes (fichier donnees_hm1_gene)
    EHI_070680.alt1	0.253142	0.676848	0.983497	0.362647	no (fichier donnees_initiales)
    EHI_070680.ref	0.352009	1204.61	8.13801	0	yes (fichier donnees_initiales)

  4. #4
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Bonjour,

    Il faut alors que tu fasses les rbind dans la boucle... en stockant le résultat intermédiaire dans une data.frame, bien entendu.

    Il doit également y avoir une option append à write.table.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Par défaut
    Oui, merci, je n'avais pas vu que append permet d'écrire à la suite d'un fichier. J'ai obtenu ce que je voulais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    test_id	value_1	value_2	ln.fold_change.	q_value	significant
    EHI_039600	0	13.9942	1.79769e+308	0.0367975	yes
    EHI_039600.ref	0	13.2368	1.79769e+308	0.0422989	yes
    test_id	value_1	value_2	ln.fold_change.	q_value	significant
    EHI_039600	0	13.9942	1.79769e+308	0.0367975	yes
    EHI_039600.ref	0	13.2368	1.79769e+308	0.0422989	yes
    test_id	value_1	value_2	ln.fold_change.	q_value	significant
    EHI_039590	0.0602808	187.737	8.04378	0	yes
    EHI_039590.ref	0.0690348	187.645	7.9077	0	yes
    test_id	value_1	value_2	ln.fold_change.	q_value	significant
    EHI_070680	0.576131	1192.2	7.63498	0	yes
    EHI_070680.alt1	0.253142	0.676848	0.983497	0.362647	no
    EHI_070680.ref	0.352009	1204.61	8.13801	0	yes
    avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (i in 1:dim(donnees_hm1_gene)[1] )
    {
    ind=grep(gsub(" ","",donnees_hm1_gene[i,1]),gsub(" ","",donnees_initiales[,1]))
    a_ecrire=rbind(donnees_hm1_gene[i,], donnees_initiales[ind,] )
     
    write.table(a_ecrire,file="Code/analyse_diff_iso/resume_up.txt",append=TRUE,sep="\t", quote=FALSE, row.names=FALSE, col.names=TRUE)
    }

  6. #6
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Pour compléter, voici ce que ça peux donner en code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    tmp <- data.frame()
     
    for (i in 1:nrow(donnees_hm1_gene) )
    {
        ind <- grep(paste("^", gsub(" ","",donnees_hm1_gene[i,1]), "\\.", sep=""),
                    gsub(" ","",donnees_initiales[,1]))
     
        tmp <- rbind(tmp,
                     rbind(donnees_hm1_gene[i,],
                           donnees_initiales[ind,]))
    }
    J'ai également ajouté davantage de contrôle sur l'expression régulière (dans le grep) :
    • "^" pour forcer l'ancrage en début de ligne.
    • "\\." pour que le motif soit obligatoirement suivi d'un point.

    Ceci afin d'éviter des problèmes lorsqu'un identifiant de
    est un sous-motif d'un autre identifiant (à toi de voir si c'est nécessaire).

    Il est probablement possible de faire plus efficace (je pense à un do.call() sur le résultat d'un sapply notamment). Mais ça demande un peu plus de réflexion.

  7. #7
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Si tu t'orientes vers la solution que tu as postée, je te conseille
    Citation Envoyé par jane40 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    write.table(a_ecrire, file="Code/analyse_diff_iso/resume_up.txt",
                append=ifelse(i==1, FALSE, TRUE),
                sep="\t", quote=FALSE, row.names=FALSE, col.names=TRUE)
    ...
    Pour éviter de te retrouver avec plusieurs fois la même chose dans ton fichier si tu relances le script.

  8. #8
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Citation Envoyé par pitipoisson Voir le message
    Il est probablement possible de faire plus efficace (je pense à un do.call() sur le résultat d'un sapply notamment). Mais ça demande un peu plus de réflexion.
    ...mais c'est moins évident à comprendre.

    Aller, je le donne pour info :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    do.call(rbind,
            lapply(1:nrow(donnees_hm1_gene),
                   function(i, init, hm1)
               {
                   return(rbind(hm1[i,],
                                init[grep(paste("^", gsub(" ","",hm1[i, 1]), "\\.", sep=""),
                                          gsub(" ","",init[ , 1])),
                                     ]))
               },
                   init=donnees_initiales,
                   hm1=donnees_hm1_gene))
    Je te laisses la joie de décomposer le bousin, mais n'hésite pas si tu as des questions.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Par défaut
    Citation Envoyé par pitipoisson Voir le message
    Si tu t'orientes vers la solution que tu as postée, je te conseille

    Pour éviter de te retrouver avec plusieurs fois la même chose dans ton fichier si tu relances le script.
    Effectivement, j'ai eu ce problème ! Merci pour la solution !

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Par défaut
    Citation Envoyé par pitipoisson Voir le message
    ...mais c'est moins évident à comprendre.

    Aller, je le donne pour info :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    do.call(rbind,
            lapply(1:nrow(donnees_hm1_gene),
                   function(i, init, hm1)
               {
                   return(rbind(hm1[i,],
                                init[grep(paste("^", gsub(" ","",hm1[i, 1]), "\\.", sep=""),
                                          gsub(" ","",init[ , 1])),
                                     ]))
               },
                   init=donnees_initiales,
                   hm1=donnees_hm1_gene))
    Je te laisses la joie de décomposer le bousin, mais n'hésite pas si tu as des questions.
    J'ai décomposé le bousin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    test=function(i, init, hm1)
    {
    return(rbind(hm1[i,],init[grep(gsub(" ","",hm1[i, 1]),gsub(" ","",init[ , 1])),]))
    }
     
    res_test=do.call(rbind,
            lapply(1:nrow(donnees_hm1_gene), function(i) {test(i,init=d_initiales,hm1=d_hm1_gene)} )
    )
     
    write.table(res_test,file="Code/analyse_diff_iso/test_up.txt",sep="\t", quote=FALSE, row.names=FALSE, col.names=TRUE)
    Et j'ai à peu près compris
    J'obtiens bien ce que je veux, de manière un peu plus rapide. Merci !

  11. #11
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Citation Envoyé par jane40 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    res_test=do.call(rbind,
            lapply(1:nrow(donnees_hm1_gene), function(i) {test(i,init=d_initiales,hm1=d_hm1_gene)} )
    )
    ...
    Histoire de prendre de bonnes habitudes avec la famille des apply, tu peux également l'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    res_test <- do.call(rbind,
                        lapply(1:nrow(donnees_hm1_gene), 
                               FUN=test,                            ## Fonction à appliquer.
                               init=d_initiales, hm1=d_hm1_gene))   ## Arguments supplémentaires à passer à FUN.

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

Discussions similaires

  1. [PERL] Comment écrire à la fin d'un fichier ?
    Par barichon21 dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2009, 08h21
  2. fonction pour écrire à la fin d'un fichier
    Par schlo dans le forum Débuter
    Réponses: 1
    Dernier message: 11/10/2009, 19h54
  3. fwrite : Comment écrire à la fin d'un fichier?
    Par philipina dans le forum Débuter
    Réponses: 5
    Dernier message: 19/08/2008, 16h10
  4. stocker des valeurs de type différent
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 28/11/2005, 09h36
  5. JSP stocker des variables javascript en session
    Par MASSAKA dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 23/08/2005, 16h17

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