in Schleife Daten einlesen von mehreren Tabellen

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

Moderatoren: EDi, jogo

Antworten
Diana
Beiträge: 8
Registriert: Mi Dez 14, 2022 1:09 pm

in Schleife Daten einlesen von mehreren Tabellen

Beitrag von Diana »

Hallo,

ich bin noch recht neu hier und hoffe, ich finde eine gute Unterstützung im Forum.

Ich habe eine funktionierende Schleife:

Code: Alles auswählen

for(i in 1:length(SQL_Bedingung)) {
mag <- rbind(mag, daten-einlesen(dbName, paste0(
"select a, b, c ",
"from ", dbBenutzer, ".", "tbldung ",
"where ...",
)))
}
Wie sieht die Syntax genau aus, wenn ich ein bis zwei weitere Tabellen einbinden möchte? In SQL ist mir die Struktur klar, jedoch in R klappt es einfach nicht.

Vielen Dank!

Diana
schubbiaschwilli
Beiträge: 254
Registriert: Di Jun 27, 2017 12:09 pm

Re: in Schleife Daten einlesen von mehreren Tabellen

Beitrag von schubbiaschwilli »

Gude!

Wenn du das per SQL machst (ich nehme an über RODBC?) kannst du ja den SQL-Befehl 'UNION' nutzen - Dann definierst du dir deine Daten über das SQL-Statement, und musst nichts in R machen.

Dank&Gruß
Schubbiaschwilli
bigben
Beiträge: 2827
Registriert: Mi Okt 12, 2016 9:09 am

Re: in Schleife Daten einlesen von mehreren Tabellen

Beitrag von bigben »

Hallo Diana,

Mit Deinem Code-Schnipsel kann ich nicht soviel anfangen, allein schon weil ich nicht weiß, was sich hinter SQL-Bedingung versteckt.

Dein

Code: Alles auswählen

mag <- rbind(mag, ...
hängt immer weitere Zeilen an mag an. Das kannst Du so weiter verwenden, aber dann muss sich natürlich dbName was ändern oder an dbBenutzer was ändern, damit Du an andere Tabellen kommst.

Ansonsten hat schubbiaschwilli natürlich Recht: Wenn Du Dich in SQL wohl fühlst, mach halt ganz viel in SQL.

LG, Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Diana
Beiträge: 8
Registriert: Mi Dez 14, 2022 1:09 pm

Re: in Schleife Daten einlesen von mehreren Tabellen

Beitrag von Diana »

Hallo Schubbiaschwilli,

kannst du mir bitte ein Beispiel nennen, wie das aussehen soll?

Vielen Dank!

Gruß

Diana
Diana
Beiträge: 8
Registriert: Mi Dez 14, 2022 1:09 pm

Re: in Schleife Daten einlesen von mehreren Tabellen

Beitrag von Diana »

Hallo Bernhard,

SQL_Bedingung bedeutet: SQL_Bedinung <- list(), anschließend folgt eine while-Schleife:

while (i <- length arta)) {
start <- i +1
ende <- i + nPaketgroesse
if (ende > lenth(arta)) {
ende <- lenth(arta)
}
i <- ende
arta_str <- paste0(arta[start:ende], collapse= "','")
SQL_Bedinung[[length[SQL_Bedinung) + 1]] <- arta_str
}

Die Paketgröße wird in diesem Fall mit 1.000 angegeben: nPaketgroesse <- 1000

Bringt dich das weiter, um mir zu helfen?

Meines Erachtens muss ich bei dfName und dbBenutzer nichts ändern. Beides greift auf die Datenbank mit den darin befindlichen Tabellen zu.

Vielen Dank!

Gruß

Diana
bigben
Beiträge: 2827
Registriert: Mi Okt 12, 2016 9:09 am

Re: in Schleife Daten einlesen von mehreren Tabellen

Beitrag von bigben »

Hallo Diana,

zunächst zu Deiner Rückfrage an schubbiaschwilli: für mich sieht es so aus, als wolltest Du einzelne Spalten aus verschiedenen Tabellen einfach aneinanderhängen um eine längere Spalte zu machen. Das geht in SQL mit UNION (ALL). Folgendes Code-Beispiel läuft unter duckdb:

Code: Alles auswählen

-- Erstmal zwei Tabellen erstellen mit Spieldaten drin:
CREATE TABLE tabelle1 (
   a INTEGER,
   b INTEGER,
   c VARCHAR
);
CREATE TABLE tabelle2 (
   a INTEGER,
   b INTEGER,
   c VARCHAR
);
INSERT INTO tabelle1 VALUES (1,1,'Das'), (2,2,'ist');
INSERT INTO tabelle2 VALUES (3,3,'ein'), (4,4,'Beispiel');
   
-- und jetzt fassen wir ausgewählte Spalten aus 
-- mehreren Tabellen zusammen
SELECT a,c FROM tabelle1 UNION ALL SELECT a,c FROM tabelle2;
Den zweiten Post kann ich mir erst später anschauen, muss jetzt erstmal arbeiten.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
bigben
Beiträge: 2827
Registriert: Mi Okt 12, 2016 9:09 am

Re: in Schleife Daten einlesen von mehreren Tabellen

Beitrag von bigben »

Hallo Diana,

sorry, so können wir nicht über Code reden:
Diana hat geschrieben: Mo Jun 17, 2024 8:33 amwhile (i <- length arta)) {
Erstmal ist da ein Klammerfehler, weil zwei Klammern zu aber nur eine aufgemacht wird.
Dann wissen wir nicht, was "arta" ist.
Punkt drei für diese Zeile: Es ist untauglich, in der while-Bedingung den Zuweisungsoperatot '<-' zu verwenden, da gehört ein Vergleichsoperator '==' hinein. Davon kannst Du Dich ganz leicht überzeugen indem Du einfach folgende Zeile in R ausführst:

Code: Alles auswählen

while(i <- 5){}
Die Abbruchbedingung i <- 5 wird nie erreicht.

Code: Alles auswählen

start <- i +1
Wenn i die Länge von arta ist und start immer größer als die Länge von arta wird, dann ist start immer zu groß um als Index für arta eingesetzt zu werden.

Code: Alles auswählen

if (ende > lenth(arta)) {
   ende <- lenth(arta)
}
Du willst ganz bestimmt die Funktion length verwenden und nicht lenth. Dass Du da nicht über einen Syntaxfehler gestolpert bist sagt mir, dass Du diese Code nie hast laufen lassen.

Code: Alles auswählen

arta_str <- paste0(arta[start:ende], collapse= "','")
Und genau hier wird start als Index für arta verwendet, was, wie oben erklärt, nicht geht.
Bringt dich das weiter, um mir zu helfen?
Nein, leider nicht. Ich verstehe jetzt immerhin besser, dass R Dich nicht versteht. Ich glaube auch, dass es keinen Sinn macht, an dem Code aus dem Eingangspost herumzubasteln, wenn das, was vorher kommt, noch nicht lauffähig vorliegt.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Diana
Beiträge: 8
Registriert: Mi Dez 14, 2022 1:09 pm

Re: in Schleife Daten einlesen von mehreren Tabellen

Beitrag von Diana »

Sorry Bernhard, das war ein Tippfehler. Natürlich muss es
while (i <- length (arta)) {
heißen.

arta ist eine Variable/Spalte, in der Daten stehen.

Den ursprünglichen Code habe ich schon oft laufen lassen. Allerdings muss ich aus datenschutzgründen den Code abtippen und da passieren schon mal Tippfehler. Natürlich soll lenth length heißen. Sorry!

Das, was ich vorher bekomme, liegt durchaus lauffähig da. Auch die for-Schleife liegt lauffähig da. Ich möchte nur eine zweite Tabelle bei der for-Schleife einbinden und kenne die genaue Syntax nicht.

Vielen Dank!

Gruß

Diana
Athomas
Beiträge: 773
Registriert: Mo Feb 26, 2018 8:19 pm

Re: in Schleife Daten einlesen von mehreren Tabellen

Beitrag von Athomas »

Allerdings muss ich aus datenschutzgründen den Code abtippen
Das ist doch großer Quark!
bigben
Beiträge: 2827
Registriert: Mi Okt 12, 2016 9:09 am

Re: in Schleife Daten einlesen von mehreren Tabellen

Beitrag von bigben »

@Athomas: Das würde ich so schnell nicht urteilen. Vielleicht steht die Code-Vorlage ausgedruckt auf einem Aufgabenblatt und bei allem anderen als Abtippen würden Daten darüber, wer wem diese Aufgabe gegeben hat offenbar. Dann muss abgetippt werden von jemandem, der bei "daten-einlesen(dbName, " nicht reflexartig zusammenzuckt.

@Diana. Das Wiederholen von "die Tabelle soll eingebunden werden" hilft halt nichts solange nicht klar ist, wie und wozu sie eingebunden werden soll. Die Fragestellung könnte die nach einem UNION sein, nach einem JOIN oder was ganz anderes. Wir sind bisher davon ausgegangen, dass Du ein Echtweltproblem lösen sollst und das wahlweise in SQL oder in R und dass Du uns dieses Echtweltproblem einfach schildern kannst. Inzwischen glaube ich, dass Du eine Aufgabe erhalten hast von der Du maximal überfordert bist und dass es nicht helfen wird, Dir einen Stups in die richtige Richtung zu geben. Du kannst versuchen, es anders zu erklären, aber Mut macht das alles gerade nicht.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten