Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Discussion: apply sur data.frame

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 28
    Localisation : France

    Informations forums :
    Inscription : janvier 2009
    Messages : 219
    Points : 61
    Points
    61

    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 :
    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 Aline Deschamps
    Chargée de Statistiques
    Inscrit en
    juin 2010
    Messages
    509
    Détails du profil
    Informations personnelles :
    Nom : Femme Aline Deschamps
    Âge : 26
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargée de Statistiques
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : juin 2010
    Messages : 509
    Points : 1 330
    Points
    1 330

    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/ .

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

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 28
    Localisation : France

    Informations forums :
    Inscription : janvier 2009
    Messages : 219
    Points : 61
    Points
    61

    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 du Club
    Profil pro
    Inscrit en
    janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 28
    Localisation : France

    Informations forums :
    Inscription : janvier 2009
    Messages : 219
    Points : 61
    Points
    61

    Par défaut

    Plus de précisions à propos des données :

    J'ai 1 data.frame initialement :
    Code :
    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 :
    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 :
    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •