Tabellen zusammenfassen

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Juniper
Beiträge: 14
Registriert: Fr Nov 27, 2020 9:32 am

Tabellen zusammenfassen

Beitrag von Juniper »

Hallo zusammen,
Ich brauche einen Rat von euch, nachdem ich viel gegoogelt habe: Ich habe 2 Tabellen, die eine hat gut 3,8 Mio. Datensätze, die andere 34.374 Datensätze. Um die Daten auszuwerten möchte ich gerne die beiden Tabellen über die ID_Nr verbinden, sie heißt in beiden Tabellen gleich. merge() und full_join bin ich schon durch, auch das deklarieren als data.table hat mich noch nicht weitergebracht. Habt ihr eine Idee, wie ich es trotzdem schaffe, sie zu verknüpfen? (Die Spalten sind auf das reduziert, was ich benötige)
Es grüßt euch herzlich
Juniper
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Tabellen zusammenfassen

Beitrag von Athomas »

merge() und full_join bin ich schon durch, auch das deklarieren als data.table hat mich noch nicht weitergebracht.
Dann wirst Du irgendwas verkehrt machen - ein bisschen mehr Details, bitte!
Juniper
Beiträge: 14
Registriert: Fr Nov 27, 2020 9:32 am

Re: Tabellen zusammenfassen

Beitrag von Juniper »

Grundsätzlich funktioniert es ja. Die Fehlermeldung lautet: "Fehler: Kann Vektor der Größe 570 MB nicht alloziieren".
Bei kleineren Tabellen klappt es. Ich müsste also die Tabelle kleiner machen. Ich habe auch schon ein Program geschrieben, welches zuerst schaut, ob die Nr aus der ersten Tabelle auch in der 2 vorhanden ist oder ob der datensatz gelöscht werden kann. Nach 3h waren 15.000 von 3,8 Mio Datensätzen abgeglichen. Das ist kein annehmbarer Zeitrahmen.
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Tabellen zusammenfassen

Beitrag von jogo »

Hallo Juniper,

willkommen im Forum!

Noch einfacher wäre es, das Ganze auf einem Computer mit mehr RAM laufen zu lassen.

Gruß, Jörg
Juniper
Beiträge: 14
Registriert: Fr Nov 27, 2020 9:32 am

Re: Tabellen zusammenfassen

Beitrag von Juniper »

Hallo Jörg,
Steht mir leider nicht zur verfügung. Ich habe 16 GB und einen core I7 10th GEN. Die Priorität im Task-Manager habe ich auch bereits auf "Hoch" gestellt.
Es grüßt dich herzlich
Juniper
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Tabellen zusammenfassen

Beitrag von Athomas »

Ich habe 16 GB und einen core I7 10th GEN.

Ich würde Dir gerne beweisen, dass das völlig ausreichend ist - aber dazu bräuchte ich Daten und eine EXAKTE Beschreibung dessen, was Du vorhast!
Wenn Du die Daten nicht weitergeben darfst, wäre ich ausnahmsweise bereit, passendes Spielmaterial zu erzeugen - dafür muss dann aber auch die Beschreibung der Daten und ihrer Eigenschaften EXAKT sein...
Juniper
Beiträge: 14
Registriert: Fr Nov 27, 2020 9:32 am

Re: Tabellen zusammenfassen

Beitrag von Juniper »

Hallo Athomas,
Leider darf ich die Daten nicht weitergeben. Damit auch meine Kolegen damit arbeiten können wäre es schön, wenn 8 GB RAM ausreichen, und ein kleinerer Prozessor.

Ich habe 2 Tabellen im data.table Format, ich nenne sie mal dt_ABC und dt_DEF.
In dt_ABC ist
- Die ID
- Eine Datumsangabe im Format "JJJJ-MM-TT"
- Eine Differenz, teilweise leer (NA)
Die ID beginnt bei 207 und endet bei 20112. Dabei kommen die IDs öfter vor, es muss nicht jede Zahl im Bereich auch als ID vorhanden sein. Insgesamt sind hier 34374 Datensätze eingetragen.

In dt_DEF ist
- Die ID
- Ein Datum im Format "JJJJ-MM-TT"
- Es folgen 2 Spalten, welche eine Ganzzahl (positiv) enthalten
- Eine weitere Datumsangabe im Format "JJJJ-MM-TT"
- Ein Standort als String
Die ID beginnt bei 162 und endet bei 20038. Auch hier gilt, dass nicht jede Zahl auch als Nummer vorhanden sein muss. Es können aber auch hier IDs mehrfach vorhanden sein. Die Tabelle umfasst 3.870.639 Datensätze.

Ich möchte gerne jede ID aus dt_ABC identisch zu der ID aus dt_DEF ist.
Ich habe es bereits mit den Funktionen dplyr::full_join und merge() probiert, außerdem habe ich bereits Funktionen geschrieben, die vergleichen und den entsprechenden Dtensatz markieren, welcher benötigt wird, oder ihn direkt in einen neuen dataframe schreiben. Ich wollte noch mal googlen nach Funktionen wie hist(), split() oder breaks(). Gibt es sowas? Macht das Sinn?

Es grüßt dich sehr herzlich und dankbar
Juniper
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Tabellen zusammenfassen

Beitrag von Athomas »

Verstehe ich richtig, dass die Datumswerte in beiden Dateien (zumindest für den Abgleich) ohne Bedeutung sind - also in einer Simulation auch weggelassen werden könnten?
Juniper
Beiträge: 14
Registriert: Fr Nov 27, 2020 9:32 am

Re: Tabellen zusammenfassen

Beitrag von Juniper »

Ja, das ist richtig. Der key ist in beiden Fällen die Nummer, über die zugeordnet wird. Den Rest der Daten brauche ich für die Auswertung, d.H. sie letzendluch im Ergebnis enthalten sein. Ich habe die Spalten schon auf das wesentliche reduziert, in dt_DEF waren es ursprünglich 250.
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Tabellen zusammenfassen

Beitrag von Athomas »

Ein "merge" ist symmetrisch, d.h. Du bekommst auch Sätze mit, die in der jeweils anderen Datei keinen Partner haben. Willst Du das?
Die Komplexität der entstehenden Datei lässt sich nicht a priori abschätzen, im Extremfall (alle IDs gleich) hätte man ca. 100 Milliarden Sätze - dann dürfte R auch in die Knie gehen :D ...

Hier mein "Experiment":

Code: Alles auswählen

library(data.table)

Anzahl_ABC <- 34374
un_dt_ABC  <- c(207, sample(207:20112, 14000), 20112)                     # vorkommende IDs

dt_ABC <- data.table(ID        = sample(un_dt_ABC, Anzahl_ABC, replace=TRUE),
                     Datum_ABC = as.Date(sample(17532:18593, Anzahl_ABC, replace=TRUE), origin=("1970-01-01")),
                     Differenz = runif(Anzahl_ABC))
Diff_Lücken <- sample(1:Anzahl_ABC, 5000)
dt_ABC[Diff_Lücken, Differenz:=NA_real_]

#---------------------

Anzahl_DEF <- 3870639
un_dt_DEF  <- c(162, sample(162:20038, 16000), 20038)

dt_DEF <- data.table(ID        = sample(un_dt_DEF, Anzahl_DEF, replace=TRUE),
                     Datum_DEF = as.Date(sample(17532:18593, Anzahl_DEF, replace=TRUE), origin=("1970-01-01")),
                     Zahl_1    = sample(1:1000, Anzahl_DEF, replace=TRUE),
                     Zahl_2    = sample(1:100,  Anzahl_DEF, replace=TRUE),
                     Ort       = sample(c("Hückeswagen", "Ostrhauderfehn","Wurmannsquick"),  Anzahl_DEF, replace=TRUE)
                     )

driss <- merge(dt_ABC, dt_DEF, by="ID", allow.cartesian=TRUE)
Antworten