Seite 1 von 2

Zwei Tabellen synchronisieren

Verfasst: Do Nov 28, 2019 9:58 am
von Geo-R
Hallo liebe Nutzer,

bin ziemlicher Anfänger mit R, habe schon einige Foren und Hilfen durchgelesen, aber komme mit dem Problem nicht weiter:

Ich habe zwei Tabellen/Matrizen.

> str(TabelleA)
Classes ‘data.table’ and 'data.frame': 104 obs. of 3 variables:
$ T_ID: int 1 1 1 1 1 1 1 1 1 1 ...
$ P_ID: int 1 2 3 4 5 6 7 8 9 10 ...
$ DIST: num 0 0.707 1.207 1.707 2.207 ...
- attr(*, ".internal.selfref")=<externalptr>

und
str(TabelleB)
Classes ‘data.table’ and 'data.frame': 104 obs. of 2 variables:
$ Location : num 0.629 1.887 3.145 4.402 5.66 ...
$ Number : int 7 0 521 0 0 0 0 0 0 0 ...
- attr(*, ".internal.selfref")=<externalptr>

Ich will die beiden Tabelle mit den Spalten DIST(TabelleA) und Location(TabelleB) verschneiden. Das habe ich auch mit dem "merge"-Befehl soweit hinbekommen.

Allerdings bin ich mit dem Ergebnis nicht zufrieden. Die gemergte Tabelle enthält viele N.A.s welche ich natürlich durch interpolation entfernen könnte...

Lieber wäre mir aber eine neue Tabelle wobei es vielleicht eine Funktion / einen Befehl gibt, der die nähste Werte der besagten Tabellen vergleicht und dann jeweils einen Wert zuordnet, so das am Ende eine Tabelle entsteht, die genauso lang ist wie davor. Tabelle B soll also in Tabelle A integriert werden und dabei nur die Spalte Number den nähsten Werten zugeordnet werden.

Vielleicht habt ihr ja eine Idee? :?

LG

Re: Zwei Tabellen synchronisieren

Verfasst: Do Nov 28, 2019 10:08 am
von Athomas
Vielleicht habt ihr ja eine Idee?
Da Du eh schon "data.table" benutzt, liegt ein "rolling join" nahe?

Re: Zwei Tabellen synchronisieren

Verfasst: Do Nov 28, 2019 10:40 am
von Geo-R
Perfekt!
Vielen Dank, damit hat es funktioniert! :)

Oder nicht ganz, teilweise werden jetzt die Werte, die keinen nähsten Distanzwert haben entfernt. Gibt es einen Befehl, der die entfernten Felder aufsummert bzw. zusätzlich einfügt? :?:

Re: Zwei Tabellen synchronisieren

Verfasst: Do Nov 28, 2019 11:51 am
von Athomas
Bitte angucken: viewtopic.php?f=20&t=11

Re: Zwei Tabellen synchronisieren

Verfasst: Do Nov 28, 2019 1:53 pm
von Geo-R
Danke für den Tipp :)

Also die Daten sollten eigentlich richtig eingelesen sein. Habe sie der einfachhalber redzuiert. Ich habe die Dateien in den Anhang gepackt. "Profil.txt" ist die Orginaldatei an die "Profil1-1.txt" angehänt werden soll.

Profil sieht so aus:

Code: Alles auswählen

> head(Profil1)
   ID     DIST Distance.Overland        X       Y        Z
1:  1 0.000000          0.000000 712026.5 5452510 404.3438
2:  2 0.662465          0.769754 712026.1 5452510 403.9518
3:  3 1.324929          1.587289 712025.6 5452509 403.4728
4:  4 1.987394          2.544486 712025.2 5452509 402.7819
5:  5 2.649858          3.423600 712024.8 5452508 402.2039
6:  6 3.312323          4.121027 712024.3 5452508 401.9859
Profil1-1 so:

Code: Alles auswählen

> head(Profil1-1)
   Location Number.of.Rocks
1: 0.236279               0
2: 0.708837               0
3: 1.181400               0
4: 1.653950               0
5: 2.126510               0
6: 2.599070               0
Die Session sieht so aus:

Code: Alles auswählen

> sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18362)

Matrix products: default

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252    LC_MONETARY=German_Germany.1252 LC_NUMERIC=C                   
[5] LC_TIME=German_Germany.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.12.6 dplyr_0.8.3       zoo_1.8-6        

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.3       lattice_0.20-38  crayon_1.3.4     assertthat_0.2.1 grid_3.6.1       R6_2.4.1         magrittr_1.5    
 [8] pillar_1.4.2     rlang_0.4.2      tools_3.6.1      glue_1.3.1       purrr_0.3.3      compiler_3.6.1   pkgconfig_2.0.3 
[15] tidyselect_0.2.5 tibble_2.1.3    

Die beiden Profile sollen also anhand der DIST und der Location verschnitten werden. Dabei soll jeder DIST-Wert genau einen Locationwert mit dem zugehöorgen Number.of.Rocks-Wert erhalten

Mein Code sieht bisher so aus:

Code: Alles auswählen

library(data.table)

setDT(Profil1)
setDT(Profil1-1)
setkey(Profil1, "DIST")
setkey(Profil1-1, "Location")
Vergleich<-Roc1[Profil1, roll= TRUE]

Vergleich[1,2]<-0

sum(Vergleich$Number.of.Rocks)
bei der Summe der Spalte Number.of.Rocks sollte eigentlich der Wert 1000 rauskommen :shock:

LG Simon

Re: Zwei Tabellen synchronisieren

Verfasst: Do Nov 28, 2019 3:00 pm
von Athomas
Wenn ich die Dateien einlesen möchte, muss ich was tun - dazu bin ich zu faul!
Warum speicherst Du sie nicht - bitte - in einer (einheitlichen!) .csv-Interpretation ohne das Tüddelütt am Anfang?
Wenn Du sie selbst schon eingelesen hast, kannst Du sie z.B. mit "fwrite" schreiben...
teilweise werden jetzt die Werte, die keinen nähsten Distanzwert haben entfernt.
Versteh ich nicht!?

Re: Zwei Tabellen synchronisieren

Verfasst: Do Nov 28, 2019 3:24 pm
von Geo-R
Vielen Dank für deine Mühe :)

ein neuer Versuch jetzt hat Tabelle A nur eine Spalte mit x-Werte,

Tabelle B zwei Spalten eine mit X-Werten und eine mit Y-Werten.

Tabelle A soll die X-Werte behalten und die Y-Werte von Tabelle B übernehmen.

Das Problem das ich sehe ist, dass Tabelle A 104 Spalten und Tabelle B 150 Spalten hat. Sprich es gibt zu viele X/Y-Werte für Tabelle A.

Daher hat, glaube ich, der rolling join nicht richtig funktioniert.

Vielleicht gibt es ja eine Möglichkeit, wenn für einen X-Wert der Tabelle A mehrere X-Werte von Tabelle B in Frage kommen eine Möglichkeit die Y-Werte zu summieren und dem nächsten X-Wert zuzuordnen.

Außerdem ist der Abstand der X-Wert in Tabelle A nicht konstant, das liegt daran, dass er aus einer Rasterdatei extrahiert wurde, wo ein Raster 0,5 Meter hat. Die Diagonalen haben aber werte von ca. 0,7m.

Tabelle B wiederrum hat immer gleich große X-Werte. Dadruch entsteht zusätzlich eine Verschiebung.

Viele Grüße

Re: Zwei Tabellen synchronisieren

Verfasst: Do Nov 28, 2019 3:44 pm
von Athomas
Guckst Du hier:

Code: Alles auswählen

library(data.table)

XY.daten <- fread("http://forum.r-statistik.de/download/file.php?id=789")
X.daten  <- fread("http://forum.r-statistik.de/download/file.php?id=788")

X.daten[  , link:=x]     # es wird ein zusätzliches "linkfeld" definiert, damit alle Variablen erhalten bleiben
setkey(X.daten, link)
XY.daten[  , link:=X]
setkey(XY.daten, link)

X.daten[XY.daten, roll="nearest"]
XY.daten[X.daten, roll="nearest"]

Re: Zwei Tabellen synchronisieren

Verfasst: Do Nov 28, 2019 4:01 pm
von Geo-R
Danke!

das sieht schon deutlich besser aus. Aber ich habe immer noch einen kleinen Fehler... :(

Wenn ich die Y-Werte summiere erhalte ich einmal 999 und einmal 1000

Code: Alles auswählen

library(data.table)

XY.daten <- fread("http://forum.r-statistik.de/download/file.php?id=789")
X.daten  <- fread("http://forum.r-statistik.de/download/file.php?id=788")

X.daten[  , link:=x]     # es wird ein zusätzliches "linkfeld" definiert, damit alle Variablen erhalten bleiben
setkey(X.daten, link)
XY.daten[  , link:=X]
setkey(XY.daten, link)

E<-X.daten[XY.daten, roll="nearest"]
E2<-XY.daten[X.daten, roll="nearest"]

sum(E$Y)    # hier erhalte ich das Ergebnis 1000
sum(E2$Y)    # hier erhalte ich der Ergebnis 999

Re: Zwei Tabellen synchronisieren

Verfasst: Do Nov 28, 2019 4:30 pm
von Athomas
Ich wollte lediglich die Funktion des "rolling join" illustrieren - und die Wirkung einer Vertauschung der Reihenfolge...

Kurz gesagt - die Inhalte der ersten Datei werden an die zweite "nach gewissen Regeln" (die Du festlegst) herangepappt.
Die Regel lautet hier: nimm den nächstgelegenen aus der "ersten" Datei. Dadurch kann es natürlich passieren, dass ein Satz aus XY.daten mit Y !=0 unter den Tisch fällt.

Eigentlich bin ich ja ein Freund der Abstraktion, aber vielleicht solltest Du mal konkret sagen was Du treibst und erreichen möchtest!?