staging.inyokaproject.org

Fortlaufend bestimmte Zahlen in Tabelle subtrahieren

Status: Ungelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

Holothuroidea

Anmeldungsdatum:
3. August 2019

Beiträge: 5

Hallo,

ich habe eine Tabelle, die in etwa so aussieht:

scaffold1   1   699399  699471  Thr AGT 0   0   66.4    
scaffold1   2   1774929 1775002 Arg TCG 0   0   67.2    
scaffold1   3   2223208 2223137 Asp GTC 0   0   62.2    
scaffold1   4   1734741 1734668 Val AAC 0   0   76.1    
scaffold2   1   2603063 2603134 Ser CGA 0   0   42.8    
scaffold2   2   2843556 2843627 Glu TTC 0   0   70.9    
scaffold2   3   3637736 3637807 Pro TGG 0   0   66.4    
scaffold2   4   3077035 3076964 His GTG 0   0   58.8    
scaffold2   5   2661282 2661211 Cys GCA 0   0   75.3    
scaffold3   1   750766  750838  Arg TCG 0   0   71.2    
scaffold3   2   1657990 1658061 Val AAC 0   0   53.9    
scaffold3   3   2078133 2077999 Thr GGT 2078095 2078034 33.5    
scaffold4   1   1400567 1400637 Gly GCC 0   0   78.5    
scaffold4   2   2410650 2410578 Phe GAA 0   0   80.1    
scaffold4   3   2406347 2406276 Thr CGT 0   0   79.6    
scaffold4   4   1301198 1301126 Lys CTT 0   0   80.2
...

Ich möchte die Zahl in Spalte 3 mit der Zahl in Spalte 4, welche eine Reihe über der Zahl in Spalte 3 ist, subtrahieren. Vielleicht macht ein Beispiel das ganze etwas klarer:

1774929-699471=
2223208-1775002=
1734741-2223137=
...

Also die erste Zahl ist "1774929" von der etwas abgezogen werden soll. Wie am Ende der Output aussehen soll, ist mir nicht so wichtig. Vermutlich ist es am einfachsten, wenn man einfach die Ergebnisse der Subtraktionen untereinander anzeigen lässt. So muss ich mir dann zwar die Zeilen anzeigen lassen und diese dann mit denen aus der originalen Tabelle vergleichen, aber das ist in Ordnung.

Gibt es eine Möglichkeit, dass in R hinzukriegen? Vielen Dank für die Hilfe.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Warum ausgerechnet mit R? Mit awk wäre das z.B. schnell erledigt die Differenz als Spalte anzuhängen:

$ awk '{print $0 " " (NR!=1 ? $3 - last_4: "NA")}; {last_4=$4}' data.csv 
scaffold1   1   699399  699471  Thr AGT 0   0   66.4     NA
scaffold1   2   1774929 1775002 Arg TCG 0   0   67.2     1075458
scaffold1   3   2223208 2223137 Asp GTC 0   0   62.2     448206
scaffold1   4   1734741 1734668 Val AAC 0   0   76.1     -488396
scaffold2   1   2603063 2603134 Ser CGA 0   0   42.8     868395
scaffold2   2   2843556 2843627 Glu TTC 0   0   70.9     240422
scaffold2   3   3637736 3637807 Pro TGG 0   0   66.4     794109
scaffold2   4   3077035 3076964 His GTG 0   0   58.8     -560772
scaffold2   5   2661282 2661211 Cys GCA 0   0   75.3     -415682
scaffold3   1   750766  750838  Arg TCG 0   0   71.2     -1910445
scaffold3   2   1657990 1658061 Val AAC 0   0   53.9     907152
scaffold3   3   2078133 2077999 Thr GGT 2078095 2078034 33.5     420072
scaffold4   1   1400567 1400637 Gly GCC 0   0   78.5     -677432
scaffold4   2   2410650 2410578 Phe GAA 0   0   80.1     1010013
scaffold4   3   2406347 2406276 Thr CGT 0   0   79.6     -4231
scaffold4   4   1301198 1301126 Lys CTT 0   0   80.2 -1105078 

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Für R könnte man data.table::shift oder dplyr::lag nutzen, um auf Elemente weiter vorne im Array zuzugreifen: https://stackoverflow.com/a/14846624. Ich habe aber gerade keine R-Umgebung zur Hand.

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2136

In awk könnte man es auch als Regel ausdrücken:

awk 'prev {print $3-prev} {prev=$4}' data.log 

Bedeutet: Wenn prev (previous) definiert wurde und nicht-leer ist, dann rechne das dritte Element der aktuellen Zeile minus den Wert von prev. Und als prev wird sich anschließend das vierte Element der aktuellen Zeile "gemerkt", damit man in der Folgezeile darauf zugreifen kann.

awk ist da recht fehlertolerant: Für die erste Zeile gibt es zum Zeitpunkt der Berechnung ja noch kein prev und somit wird die betreffende Regel einfach ignoriert. Dieses Verhalten ist an der Stelle auch erwünscht und kann genutzt werden. Der Nachteil ist, dass man sich subtile Fehler einfangen kann, dadurch dass awk zwar weniger meckert, aber andererseits möglicherweise ungewollte Dinge tut, die einem mangels Fehlermeldung nicht sofort auffallen...

Antworten |