dopplte Daten entfernen
|
Seitenanfang |
| Hallo, Ich arbeite gerade an einem Bioinformatik Projekt und hab erst zum Perl programmieren angefangen. Ich habe da folgendes Problem: Ich habe ein .csv file mit ca >2000 Daten einige Daten sind mehrfach vorhanden und die würde ich gerne raushauen. Das Problem ist aber sehr komplex. die Liste sieht ungefähr so aus: 1;up;Lamb2;22 2;down;KTR8;3434 3;down;Lamb2;22 ich würde jetzt gerne die die doppelt sind raushauen... wie kann man das angehen denn die Daten sind nicht immer komplett ident. Ich will nach der GeneID (die letzte zahl) vergleichen, wenn die gleich ist, die weiteren raushauen... (Weiteres Ziel wäre es dann auch noch zu schaun wenn "up" steht in eine neue Spalte die Anzahl für up und in eine andere Spalte die Anzahl für "down" speichern) Für Hilfe wäre ich sehr sehr dankbar, denn ich hab da überhaupt keinen Durchblick! Gruß backstaia
Datum: 05.12.2005-19:00

|
re: dopplte Daten entfernen
|
Seitenanfang |
Hi, sowas in der Art?
#!/usr/bin/perl -wuse strict; use Data::Dumper; my %genes; while (<DATA>) { chomp; my @fields = split(/;/, $_); $genes{$fields[3]}{$fields[1]}++; $genes{$fields[3]}{'name'} = $fields[2]; } print Dumper(\%genes); __DATA__ 1;up;Lamb2;22 2;down;KTR8;3434 3;down;Lamb2;22 4;up;Lamb2;22 5;down;KTR8;3434 6;down;Lamb2;22 7;up;Lamb2;22 8;down;KTR8;3434 9;down;Lamb2;22
Gruss, svenXY
Datum: 06.12.2005-08:39

|
re: dopplte Daten entfernen
|
Seitenanfang |
| Hallo svenXY, vielen Dank für die schnelle antwort, aber ich verstehe nicht ganz was dein Skript macht. mein Tabelle würde ich mir am Ende so vorstellen: Lamb2;22;1;1 <- also Lamb2;22(GeneID); ist 1 mal up; und 1 mal down; KRT8;3434;1,- <- KRT8 war in der Liste 1 mal up und 0 mal down Wie kann ich das angehen, ich glaube mit deinem Skript habe ich aber schon einen guten Anhaltspunkt! Vielen Dank für die Hilfe! Gruß
Datum: 06.12.2005-13:04

|
re: dopplte Daten entfernen
|
Seitenanfang |
| Auch das ist kein Problem: Also, ich habe Deine cvs Daten in mein Skript rein und hole sie mit dem Filehandle DATA - Du musst natürlich erst eine Datei aufmachen. Dann nehme ich jede Zeile, entferne das newline (chomp) und splitte am Semikolon. Die Ergebnisse kommen in ein Array. Jetzt baue ich einen Hash, jeweils mit der ID des Gens als Schlüssel. Darunter entsehen drei weitere Schlüssel: 'name' mit dem Namen, sowie 'up' und 'down', die jeweils wenn da ein up steht (oder eben down) um eins hochgezählt (inkrementiert) werden (++). Dann gehe ich nur noch mit foreach durch den Hash und gebe die Zeilen wieder aus. Dabei setze ich noch up oder down auf Null, falls es den Schlüssel nicht gibt. Das Data::Dumper in meinem vorigen Post kann man benutzen, um sich die Struktur des Hashes anzuschauen - das ist sehr lehrreich und hilft, den Code besser zu verstehen. #!/usr/bin/perl -wuse strict; my %genes; while (<DATA>) { chomp; my @fields = split(/;/, $_); $genes{$fields[3]}{$fields[1]}++; $genes{$fields[3]}{'name'} = $fields[2]; } foreach (sort keys %genes) { my $up = $genes{$_}{'up'} || 0; my $down = $genes{$_}{'down'} || 0; print "$genes{$_}{'name'};$_;$up;$down\n"; } __DATA__ 1;up;Lamb2;22 2;down;KTR8;3434 3;down;Lamb2;22
Die unterschiedlichen ups and downs kamen zustande, weil ich die Tabelle etwas verlängert hatte (wenn Du nochmal meinen vorherigen Post anschauen willst). Gruss, svenXY
Datum: 06.12.2005-15:50

|
re: dopplte Daten entfernen
|
Seitenanfang |
| Vielen, vielen Dank! tiefe Verneigung, hätte ich sicher nicht so schnell hingekriegt! mein Projekt ist gerettet! Gruß backstaia
Datum: 06.12.2005-21:34

|
re: dopplte Daten entfernen
|
Seitenanfang |
| Hallo nochmal, ein kleines Problem habe ich da noch. Wie kann ich jetzt eine weitere Spalte in meinen hash einbauen und den auch mitnehmen? Ich will jetzt die Spalte mit Hs. zusätzlich einbauen. Ich hab schon alles probiert, aber komme nicht drauf. Liegt wahrscheinlich daran das ich die hash noch nicht ganz verstehe... 1;down;LOC389347;389347;Hs.368516 2;down;13CDNA73;10129;Hs.507669 3;down;13CDNA73;10129;Hs.507669 4;down;AARSL;57505;Hs.558525 5;down;ABCA12;26154;Hs.134585 6;down;ABCA6;23460;Hs.195395 7;down;ABCA6;23460;Hs.195395 Für Hilfe wäre ich sehr Dankbar! Gruß backstaia
Datum: 09.12.2005-15:18

|
re: dopplte Daten entfernen
|
Seitenanfang |
| wo kommt denn das Hs auf einmal her? Ist es für jede Gene-ID immer das Selbe, also z.B. für ID 23 immer 56? Dann wäre es nach dem split im Ergebnisarray[4] und kann einfach auch in den Hash reingschrieben werden. Ich bin sicher, Du kriegst das geregelt. svenXY
Datum: 09.12.2005-16:21

|
re: dopplte Daten entfernen
|
Seitenanfang |
jetzt hab ichs! aller anfang ist schwer... Danke!Gruß backstaia
Datum: 09.12.2005-17:34

|
re: dopplte Daten entfernen
|
Seitenanfang |
| schon wieder ich! das Programm funktioniert jetzt echt perfekt, aber wie könnte man einem Anfänger(also mir) verständlich machen, was in diesen Codezeilen genau passiert: $genes{$fields[3]}{$fields[1]}++; $genes{$fields[3]}{'name'} = $fields[2]; $unigene{$fields[3]}{'unigene'} = $fields[4]; die letzte Zeile ist von mir... also du erzeugst einen hash (%genes) und splittest die Daten am ; auf und gibst das ganze in ein array.Dann verlinkst fields[3] (Genname) mit field[1] (up/down) und zählst rauf... irgndwie ist mir das noch nicht ganz klar... dann sagst du $fields[3] ist der Wert und 'name' der schlüssel und das verlinkst du mit fields[2] alles andere (naja, viel ist das eh nicht) ist mir klar. ich glaub ich hab echt noch viel zu lernen... aber vielen Dank für die tolle Hilfe!!!! gruß backstaia
Datum: 09.12.2005-17:50

|