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 :

apply sur data.frame


Sujet :

R

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut apply sur data.frame
    Bonjour à tous,

    Je suis en train de transformer une boucle for en une fonction apply car la taille des données traitées devient importante.
    J'arrive à utiliser apply ou sapply habituellement mais pas cette fois ; je travaille avec 2 data.frame, que j'ai besoin de ressortir à la fin. C'est là mon souci.
    Je pense qu'il n'est pas encore utile de poster les divers messages d'erreur tant que je ne sais pas comment ressortir ces 2 data.frame...
    Voici en gros mon code :

    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
    24
    25
    26
    27
    28
    29
    30
     
    data_calcul_position=data_new_germline[,c(1,2,2,3,4)]
     
    calculs_g=function(i,data_calcul_position,data_new_germline){
    	if (substr(data_calcul_position$var[i],1,1)=="-")
    	{
    	data_calcul_position$position[i]=data_calcul_position$position[i]+1
    	data_calcul_position$positionEnd[i]=data_calcul_position$positionEnd[i]+nchar(as.character(data_calcul_position$var[i]))-1
    	data_calcul_position$new_ref[i]= sapply(strsplit(as.character(data_calcul_position$var[i]), "-"), function(x) x[2])  
    	data_calcul_position$new_var[i]="-"
    	}
     
    	else if (substr(data_calcul_position$var[i],1,1)=="+")
    	{
    	data_calcul_position$position[i]=data_calcul_position$position[i]+1
    	data_calcul_position$positionEnd[i]=data_calcul_position$positionEnd[i]+1
    	data_calcul_position$new_ref[i]="-"
    	data_calcul_position$new_var[i]=sapply(strsplit(as.character(data_calcul_position$var[i]), "+"), function(x) x[2]) 
    	data_new_germline$position[i]=data_calcul_position$position[i]
    	}
     
    	else
    	{
    	data_calcul_position$new_ref[i]=as.character(data_calcul_position$ref[i])
    	data_calcul_position$new_var[i]=as.character(data_calcul_position$var[i])
    	}
    return(list(data_calcul_position,data_new_germline))		
    }
     
    s_calcul_g=sapply(1:nrow(data_calcul_position), function(i) {calculs_g(i,data_calcul_position,data_new_germline)})
    J'ai essayé de retourner les champs des data.frame plutôt que les data.frame eux-mêmes mais ça n'a pas été mieux ! Après une petite recherche, j'ai essayé également la fonction adply du package plyr, sans succès.

    Savez-vous s'il est possible de retourner un data.frame dans une fonction apply ? Et si non, que me conseillez-vous ?
    Merci d'avance

  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 : 35
    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
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    Pour les différents formats de sorties possibles, voir l'aide des fonctions : ?apply ?sapply

    Sinon concernant votre code, le mieux serait que vous nous fournissiez un exemple reproductible (par exemple avec vos jeux de données réduits à quelques lignes/colonnes), même si le code renvoit une erreur au moins cela permettra d'essayer de comprendre, car comme ça c'est plutôt difficile de se plonger dedans et vous risquez de ne pas avoir beaucoup de réponses...

    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 régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut
    Merci. Je vais essayer de résumer en un petit exemple reproductible.

    Mais déjà est-il possible de me dire si certaines personnes ont réussi à renvoyer des data.frame ? Je m'étais penchée sur les fonctions apply, sapply et lapply qui ne semblent pas convenir dans mon cas car il s'agit de data.frame.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut
    Plus de précisions à propos des données :

    J'ai 1 data.frame initialement :
    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
     
    print(dim(data_new_germline))
    [1] 16605    23
     
    print(head(data_new_germline))
    chrom position ref var normal_reads1 normal_reads2 normal_var_freq normal_gt
    chr1   753269   C   G             0            31            100%         G
    chr1   808922   G   A             0           134            100%         A
    chr1   866319   G   A             0            32            100%         A
    chr1   880238   A   G             0            12            100%         G
    chr1   887560   A   C             0            35            100%         C
    chr1  1479152  C   -CT	      70          0	           0%         	C
    chr1	878516  G   -A            9	           0	            0%	  G
    tumor_reads1 tumor_reads2 tumor_var_freq tumor_gt somatic_status
    0           52           100%        G       Germline
    0          135           100%        A       Germline
    0           34           100%        A       Germline
    0           14           100%        G       Germline
    0           26           100%        C       Germline
    42	    16           27.59%	 */-CT	Somatic
    2	     11	   84.62%	-A/-A	     Somatic
    Lorsqu'il y a + ou - dans var, je dois modifier la référence et/ou le variant et/ou la position. C'est ce qui est fait par le code suivant :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    data_calcul_position=data_new_germline[,c(1,2,2,3,4)]
    colnames(data_calcul_position)=c("chrom","position","positionEnd","ref","var")
     
    calculs_g=function(i,data_calcul_position,data_new_germline){
    	if (substr(data_calcul_position$var[i],1,1)=="-")
    	{
    	data_calcul_position$position[i]=data_calcul_position$position[i]+1
    	data_calcul_position$positionEnd[i]=data_calcul_position$positionEnd[i]+nchar(as.character(data_calcul_position$var[i]))-1
    	data_calcul_position$new_ref[i]= sapply(strsplit(as.character(data_calcul_position$var[i]), "-"), function(x) x[2])  
    	data_calcul_position$new_var[i]="-"
    	}
     
    	else if (substr(data_calcul_position$var[i],1,1)=="+")
    	{
    	data_calcul_position$position[i]=data_calcul_position$position[i]+1
    	data_calcul_position$positionEnd[i]=data_calcul_position$positionEnd[i]+1
    	data_calcul_position$new_ref[i]="-"
    	data_calcul_position$new_var[i]=sapply(strsplit(as.character(data_calcul_position$var[i]), "+"), function(x) x[2]) 
    	data_new_germline$position[i]=data_calcul_position$position[i]
    	}
     
    	else
    	{
    	data_calcul_position$new_ref[i]=as.character(data_calcul_position$ref[i])
    	data_calcul_position$new_var[i]=as.character(data_calcul_position$var[i])
    	}
    return(list(data_calcul_position,data_new_germline))		
    }
     
    s_calcul_g=sapply(1:nrow(data_calcul_position), function(i) {calculs_g(i,data_calcul_position,data_new_germline)})
    data_calcul_position=s_calcul_g
    Une fois le formatage des données effectué, je mets dans le data.frame data_new_germline les "données propres".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    data_new_germline$ref=data_calcul_position$new_ref
    data_new_germline$var=data_calcul_position$new_var
    data_new_germline$position=data_calcul_position$position
    Voici le message d'erreur obtenu avec ce code :
    Error in `$<-.data.frame`(`*tmp*`, "new_ref", value = c(NA, "G")) :
    replacement has 2 rows, data has 16605
    Calls: sapply ... lapply -> FUN -> calculs_g -> $<- -> $<-.data.frame
    Execution halted
    J'espère que ma question est plus compréhensible maintenant

Discussions similaires

  1. travail complexe sur data frame
    Par Marwai dans le forum R
    Réponses: 2
    Dernier message: 17/07/2014, 15h31
  2. mean() sur ligne data.frame : problème des levels
    Par AustinPower999 dans le forum R
    Réponses: 0
    Dernier message: 01/04/2013, 22h11
  3. [Tomcat]restriction d'accès à une appli sur IP
    Par cwamgis dans le forum Tomcat et TomEE
    Réponses: 5
    Dernier message: 15/03/2010, 11h54
  4. [Formulaires] Résultat sur autres frames
    Par -DeN- dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 29/08/2005, 11h33
  5. Simulation de la parallelisation d'une appli sur un réseau
    Par dinver dans le forum Développement
    Réponses: 1
    Dernier message: 24/06/2005, 19h37

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