Extraire des donnees de deux tableaux - Perl - Programmation
Marsh Posté le 09-01-2013 à 14:27:23
Bonjour, c'est tout bête, et vous y étiez presque à mon avis:
Vous créez un hash, qui va avoir pour clé le nom ('FBgn0025' par exemple) et pour valeur l'info.
Vous lisez le premier fichier et créez une entrée dans le hash pour chaque ligne avec une valeur bidon pour l'info ('' par exemple)
Vous lisez le second fichier, et pour chaque ligne si le hash a une entrée pour la clé (tester avec exists) vous associez a cette entrée l'info comme valeur.
Si ces infos ne vous suffisent pas, je vous écrirais le code, mais à vue de nez ce serait, en partant de votre code (qui manifestement fait d'autres choses)
open FILEIN, "< tableaux1.txt" or die "Input file open failed: $!";
while(defined($l=<FILEIN> )){
chomp $l;
($FBg, $count) = split /\t/,$l;
$transtogene{$FBg} = '';
}
close FILEIN;
open FILEIN, "< tableaux2.txt" or die "Input file open failed: $!";
while(defined($l=<FILEIN> )){
chomp $l;
@a = split /\t/,$l;
$transtogene{$a[0]} = $a[1] if exists $transtogene{$a[0]};
}
close FILEIN;
open FILEOUT, "> tableaux3.txt" or die "Output file open failed: $!";
@k = keys %transtogene;
@k = sort @k;
foreach $e (@k){
say FILEOUT "$e\t$transtogene{$e}";
}
close FILEOUT;
A+,
Marsh Posté le 09-01-2013 à 15:48:00
Chouette!
Attention au cas des gènes présents dans le premier et pas le second, que j'ai vu en faisant un petit test (je ne connais pas vos données, donc ce n'est peut être pas possible avec).
Si j'avais eu à l'écrire, j'aurais écrit ceci:
Code :
|
En lecture, plutôt que regarder si les lignes sont defined (je comprends d'ailleurs pas trop l'emploi du test avec defined dans votre code), je ne fais une action que si un \t est repéré dans la ligne, ça m'a paru plus efficace au vu de vos lignes utiles.
undef $data{'key'} est un idiome qui force la création de la clé 'key' pour pouvoir mettre sa valeur associée à undef, ce qu'on peut tester ensuite avec defined.
A+,
Marsh Posté le 11-01-2013 à 17:11:53
Merci encore pour la derniere fois.
Helas, j'ai encore un probleme.
J'ai toujours 2 tableaux (2 fichiers excels), mais cette fois je cherche les genes se situant entre deux coordonnees.
Voila a quoi ressemble mon premier tableau: Start End Middle
1000 1200 1100
2200 3000 2600
5000 6000 5000
Et voila a quoi ressemble le deuxieme tableau: Start End Genes
980 1100 FBgn00026
2500 5000 FBgn0027
3060 4500 FBgn0028
5200 7000 FBgn0029
5400 5800 FBgn0030
6050 8000 FBgn00036
En gros je voudrais un fichier de sortie avec seulement les genes et leur coordonnee correspondant seulement aux coordonnees du tableau 1. Ou autrement, les genes se situant sur les coordonnees de mon tableau 1.
C'est a dire si je reprend mon exemple: Start End Genes
980 1100 FBgn00026
2500 5000 FBgn0027
5200 7000 FBgn0029
5400 5800 FBgn0030
J'avoue que je n'arrive pas a faire de script Perl pour faire cela.
Si quelqu'un avait une solution, cela m'aiderai beaucoup.
Merci d'avance.
Marsh Posté le 11-01-2013 à 21:11:28
Bonjour,
Je crains de ne pas bien avoir compris sur quel critères vous éliminez la ligne contenant FBgn0029.
Pourriez vous préciser ceci. Merci.
Parce que à la base, le code final va probablement ressembler à ceci:
Code :
|
Les numéros de colonnes sont 0 et 1, car j'ai testé avec les fichiers d'exemple suivants:
Start End Middle |
et
Start End Genes |
A+,
Marsh Posté le 12-01-2013 à 11:13:10
Merci pour la reponse.
Alors je n'élimine pas FBgn0029 mais FBgn0028 car ce gene ne recouvre aucune region de mon tableau 1. C'est justement ce que je voudrais, c'est à dire garder seulement les gènes qui recouvre mes regions d'interets du tableau.
Mon probleme est justement que je n'arrive pas a trouve quels criteres peut me permettre de faire ça.
J'espere que c'est plus claire.
A+,
Marsh Posté le 12-01-2013 à 13:52:58
Ah! J'ai pigé!
Le critère devrait être
($range->[0] <= $start and $start <= $range->[1]) or ($range->[0] <= $end and $end <= $range->[1])
C'est a dire que le début pour un gène est dans une zone qui vous intéresse, ou bien que sa fin l'est.
Au final ça fait ceci:
Code :
|
ce qui sur les données test me donne ceci en sortie:
980 1100 FBgn00026 |
Ce qui colle avec ce que vous m'aviez mis en exemple.
A+,
Marsh Posté le 14-01-2013 à 14:38:14
Bonjour,
Je suis en train d'utiliser le script que vous m'avez donne et je vous en remercie encore.
Mais j'ai remarque que les genes qui sont beaucoup plus grand que mes valeurs ne sont pas pris en compte.
Par exemple, si j'ai dans le tableau 1: Start End Middle
1000 2000 1500
Le gene: Start End Middle
800 4000 1000
Ne vas pas etre pris en compte, alors que je le voudrais.
Ne serait-il pas mieux d'utiliser la valeur "Middle" plutot que le Start et le End.
Merci.
A+,
Marsh Posté le 14-01-2013 à 17:41:59
Bonjour, je vois que mon critère n'était pas le bon en effet.
En fait, le bon critère est d'exclure les gènes vérifiant la proposition opposée: ils n'ont pas d'intersection avec une zone d'intérêt et donc sont avant le début ou après la fin d'une telle zone.
il suffit donc d'exclure les gènes dont la fin est avant le début de la zone d'intérêt ou dont le début est après la fin de la zone d'intérêt, et donc de remplacer la ligne
if (($range->[0] <= $start and $start <= $range->[1]) or ($range->[0] <= $end and $end <= $range->[1])) {
par
unless (($end < $range->[0]) or ($start > $range->[1])) {
A+,
Marsh Posté le 09-01-2013 à 09:55:38
Bonjour,
Je viens juste de commencer Perl et j'aurai besoin de votre aide.
J'ai 2 tableaux, l'un avec une colonne contenant une liste de genes de la forme: FBgn0025
FBgn0036
FBgn0059
............
Dans mon deuxieme tableau, j'ai aussi une colonne avec une liste de genes dont certains sont les meme que ceux du tableau precedent et dans une deuxieme colonne, j'ai des informations sur chaque gene.
Ce tableau 2 est de cette forme: FBgn0045 Info
FBgn0036 Info
FBgn0089 Info
............ ....
Ce que je voudrais, c'est recuperer les infos du tableau 2 mais seulement pour les genes du tableau 1.
en gros je voudrais en fichiers de sortie, un tableaux avec ma liste de genes du tableau 1 et les infos sur ces genes.
J'ai essaye different script sans jamais arrive a un resultat.
Voila le dernier script que j'ai fait:
use v5.10.1;
open FILEIN, "< tableaux2.txt" or die "Input file open failed: $!";
while(defined($l=<FILEIN> )){
chomp $l;
@a = split /\t/,$l;
$transtogene{$a[0]} = $a[1];
}
close FILEIN;
open FILEIN, "< tableaux1.txt" or die "Input file open failed: $!";
while(defined($l=<FILEIN> )){
chomp $l;
($FBg,$count) = split /\t/,$l;
$FBgn = $transtogene{$FBg};
$genecount{$FBgn} += $count;
}
close FILEIN;
open FILEOUT, "> tableaux3.txt" or die "Output file open failed: $!";
@k = keys %genecount;
@k = sort @k;
foreach $e (@k){
say FILEOUT "$e\t$genecount{$e}";
}
close FILEOUT;
Toute aide ou suggestions me serait utile.
Merci.