Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > R
R Forum d'entraide sur la programmation en langage R
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/01/2013, 10h51   #1
jane40
Membre du Club
 
Inscription : janvier 2009
Messages : 219
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France

Informations forums :
Inscription : janvier 2009
Messages : 219
Points : 65
Points : 65
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
jane40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 11h17   #2
A. D.
Modératrice
 
Femme Aline Deschamps
Chargée de Statistiques
Inscription : juin 2010
Messages : 464
Détails du profil
Informations personnelles :
Nom : Femme Aline Deschamps
Âge : 25
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 : 464
Points : 1 294
Points : 1 294
Envoyer un message via Skype™ à A. D.
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.
A. D. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 11h24   #3
jane40
Membre du Club
 
Inscription : janvier 2009
Messages : 219
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France

Informations forums :
Inscription : janvier 2009
Messages : 219
Points : 65
Points : 65
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.
jane40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 12h09   #4
jane40
Membre du Club
 
Inscription : janvier 2009
Messages : 219
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France

Informations forums :
Inscription : janvier 2009
Messages : 219
Points : 65
Points : 65
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 :
Citation:
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
jane40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h27.


 
 
 
 
Partenaires

Hébergement Web