Werte von mehreren Tabellen multiplizieren

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

ademi
Beiträge: 22
Registriert: Mi Sep 25, 2019 3:15 pm

Werte von mehreren Tabellen multiplizieren

Beitrag von ademi »

Hallo zusammen,

ich bin neu hier in Forum und generell in R. Ich habe keine Erfahrungen mit anderen Programmiersprachen und bisher nur Excel für meine Berechnungen verwendet. Nun möchte ich die Modelle, die wir im Betrieb mit Excel konstruiert haben, in R übertragen und vielleicht auch anders aufbauen (weil es langsam unübersichtlich wird) und habe damit begonnen, mich im Netz einzulesen und Sachen auszuprobieren. Nach mehreren Stunden Googeln habe ich aber keine passende Funktion zum Multiplizieren von Tabellen gefunden. Vielleicht könnte mir da jemand helfen. Eine Bespieldatei hänge ich an.

Vielen Dank.
Dateianhänge
Beispiel.xlsx
(15.13 KiB) 18-mal heruntergeladen
bigben
Beiträge: 2777
Registriert: Mi Okt 12, 2016 9:09 am

Re: Werte von mehreren Tabellen multiplizieren

Beitrag von bigben »

Hallo und herzlichen Glückwunsch zu der Entscheidung, jetzt auf ein besser skalierbares System als Excel umzusteigen!

Du wirst in vielen Punkten umdenken müssen. Wir denken nicht in Tabellen sondern in Datensätzen und Die Anordung der Excel-Daten, wo Daten aus verschiedenen Tabellen in der gleichen Spalte untereinander stehen, das lässt alles noch erkennen, dass das Denken noch nicht auf R umgestellt ist.

Ich weiß auch nicht genau, was Du mit Tabellen multiplizieren meinst, aber vielleicht habe ich Dein Anliegen so gut verstanden, dass das hier weiter hilft:

Code: Alles auswählen

Tabelle1 <- read.table(row.names = 1, header=TRUE,
                       text="Name 2019 2020 2021 2022
                       Mercedes 897 365 438 967
                       Opel 582 785 213 561
                       Fiat 12 46 37 75
                       BMW 83 98 43 37
                       Audi 123 345 678 987
                       ")

Tabelle2 <- read.table(header = TRUE,
                       text="Name Diesel Benzin Hybrid
                       Mercedes 0.30 0.35 0.35
                       Opel 0.50 0.25 0.25
                       Fiat 0.45 0.45 0.10
                       BMW 0.30 0.35 0.35
                       Audi 0.35 0.35 0.30")

Tabelle1 * Tabelle2$Diesel
Tabelle1 * Tabelle2$Benzin
Tabelle1 * Tabelle2$Hybrid
Sonst bitte gerne nochmal mit genauerer Fragestellung.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
ademi
Beiträge: 22
Registriert: Mi Sep 25, 2019 3:15 pm

Re: Werte von mehreren Tabellen multiplizieren

Beitrag von ademi »

bigben hat geschrieben: Do Sep 26, 2019 2:14 pm Hallo und herzlichen Glückwunsch zu der Entscheidung, jetzt auf ein besser skalierbares System als Excel umzusteigen!

Du wirst in vielen Punkten umdenken müssen. Wir denken nicht in Tabellen sondern in Datensätzen und Die Anordung der Excel-Daten, wo Daten aus verschiedenen Tabellen in der gleichen Spalte untereinander stehen, das lässt alles noch erkennen, dass das Denken noch nicht auf R umgestellt ist.

Ich weiß auch nicht genau, was Du mit Tabellen multiplizieren meinst, aber vielleicht habe ich Dein Anliegen so gut verstanden, dass das hier weiter hilft:

Code: Alles auswählen

Tabelle1 <- read.table(row.names = 1, header=TRUE,
                       text="Name 2019 2020 2021 2022
                       Mercedes 897 365 438 967
                       Opel 582 785 213 561
                       Fiat 12 46 37 75
                       BMW 83 98 43 37
                       Audi 123 345 678 987
                       ")

Tabelle2 <- read.table(header = TRUE,
                       text="Name Diesel Benzin Hybrid
                       Mercedes 0.30 0.35 0.35
                       Opel 0.50 0.25 0.25
                       Fiat 0.45 0.45 0.10
                       BMW 0.30 0.35 0.35
                       Audi 0.35 0.35 0.30")

Tabelle1 * Tabelle2$Diesel
Tabelle1 * Tabelle2$Benzin
Tabelle1 * Tabelle2$Hybrid
Sonst bitte gerne nochmal mit genauerer Fragestellung.

LG,
Bernhard
Hallo Bernhard,

vielen Dank für die Ermunterung und die Hilfe. Das mit Umdenken ist klar - noch nicht stattgefunden, aber ich hoffe, es kommt mit der Zeit. Ich befasse mich mit R erst seit ein Paar Tagen.
Mit dem Multiplizieren von Tabellen habe ich es tatsächlich so gemeint, dass die Werte aus der ersten Tabelle mit den Werten aus der zweiten Tabelle multipliziert werden. Bei mir hat es nicht geklappt, weil ich, statt Vektoren aus den Spalten der zweiten Tabelle zu bilden, mit data.frames [eckige Klammer] multipliziert habe, und es gab immer eine Fehlermeldung, dass diese Funktion nur für Tabellen mit der gleichen Größe ist. Jetzt weiß ich es und bin sehr dankbar für die schnelle Aufklärung!

Liebe Grüße
Aijan
ademi
Beiträge: 22
Registriert: Mi Sep 25, 2019 3:15 pm

Re: Werte von mehreren Tabellen multiplizieren

Beitrag von ademi »

Hallo,
ich habe folgendes Problem zu dem gleichen Thema. Wenn ich Werte von 2 Tabellen miteinander multipliziere, dann kommt es beim Multiplizieren logischerweise in der ersten Spalte überall NA, weil es Zeilennamen sind und nicht Zahlen. Wie kriege ich das hin, dass sie immer als Zeilennamen erkannt werden und nicht multipliziert?

Liebe Grüße
bigben
Beiträge: 2777
Registriert: Mi Okt 12, 2016 9:09 am

Re: Werte von mehreren Tabellen multiplizieren

Beitrag von bigben »

Hallo ademi,

R kennt Zeilennamen als eigene Entität. Du brauchst keine Spalte mit Eigennamen einzufügen. OBen hatte ich folgendes gepostet:

Code: Alles auswählen

Tabelle1 <- read.table(row.names = 1, header=TRUE,
                       text="Name 2019 2020 2021 2022
                       Mercedes 897 365 438 967
                       Opel 582 785 213 561
                       Fiat 12 46 37 75
                       BMW 83 98 43 37
                       Audi 123 345 678 987
                       ")
Dort liest Du row.names = 1 was soviel heißt wie: "Die Zeilennamen stehen in Spalte 1".
Wieviele Spalten hat die so eingelesene Tabelle?

Code: Alles auswählen

> ncol(Tabelle1)
[1] 4
Die Tabelle hat nur 4 Spalten weil die Zeilennamen nicht als Spalte zählen. Deshalb sind mit dieser Tabelle auch einfache Rechnungen möglich, beispielsweise

Code: Alles auswählen

> Tabelle1 * 2
         X2019 X2020 X2021 X2022
Mercedes  1794   730   876  1934
Opel      1164  1570   426  1122
Fiat        24    92    74   150
BMW        166   196    86    74
Audi       246   690  1356  1974
R hat anstandslos alle Spalten mit 2 multipliziert und sich um die Namen nicht gekümmert. Nehmen wir an, Du hättest keine Zeilennamen vergeben, stattdessen die Spalte 1 belassen:

Code: Alles auswählen

Tabelle1 <- read.table(header=TRUE,
                       text="Name 2019 2020 2021 2022
                       Mercedes 897 365 438 967
                       Opel 582 785 213 561
                       Fiat 12 46 37 75
                       BMW 83 98 43 37
                       Audi 123 345 678 987
                       ")
Da kannst Du jetzt selbst prüfen, wieviele Spalten das hat. Wir können immer noch die Spaltennamen nach der ersten Spalte vergeben und dann Spalte 1 löschen:

Code: Alles auswählen

rownames(Tabelle1) <- Tabelle1[,1]
Tabelle1$Name <- NULL
In meiner Antwort oben hatte ich das für Tabelle1 und für Tabelle2 unterschiedlich gehandhabt. In Tabelle2 hatte ich die Namen-Spalte stehen lassen, aber Du weißt ja jetzt, wie Du das korrigieren kannst.

HTH,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
ademi
Beiträge: 22
Registriert: Mi Sep 25, 2019 3:15 pm

Re: Werte von mehreren Tabellen multiplizieren

Beitrag von ademi »

bigben hat geschrieben: Do Okt 10, 2019 2:26 pm Hallo ademi,

R kennt Zeilennamen als eigene Entität. Du brauchst keine Spalte mit Eigennamen einzufügen. OBen hatte ich folgendes gepostet:

Code: Alles auswählen

Tabelle1 <- read.table(row.names = 1, header=TRUE,
                       text="Name 2019 2020 2021 2022
                       Mercedes 897 365 438 967
                       Opel 582 785 213 561
                       Fiat 12 46 37 75
                       BMW 83 98 43 37
                       Audi 123 345 678 987
                       ")
Dort liest Du row.names = 1 was soviel heißt wie: "Die Zeilennamen stehen in Spalte 1".
Hallo Bernhard,

erstmals vielen Dank für deine prompte Antwort und die Mühe, die Basics dem Anfänger zu zerkauen.

OK, das mit row.names =1 habe ich nicht beachtet und meine Daten so eingelesen. Jetzt aber, wenn ich versuche, das zu korrigieren, kommt eine Fehlermeldung
Fehler in read.table(file = file, header = header, sep = sep, quote = quote, :
doppelte 'row.names' sind nicht zulässig
Meine Daten habe ich mir vorher als csv-Dateien gespeichert und mit read.csv eingelesen.

Woher kommt die Fehlermeldung?

und noch eine Frage: anstelle der leere Zeilen steht dann auch NA, wie kann man diese NA vermeiden, dass 0 oder gar nichts drin steht?

LG
ademi
bigben
Beiträge: 2777
Registriert: Mi Okt 12, 2016 9:09 am

Re: Werte von mehreren Tabellen multiplizieren

Beitrag von bigben »

Hallo ademi,

über Fehlermeldungen lässt sich nur sprechen, wenn man den genauen Aufruf der Funktion kennt. Poste bitte eine kleine csv-Datei und das genaue Kommando, mit dem der Fehler entsteht sowie die genaue und vollständige Fehlermeldung.

Die Funktion read.csv und read.table sind übrigens weitgehend identisch. Bei read.csv ist im Wesentlichen nur header = TRUE und sep = "," voreingestellt. row.names sollte bei beiden gleich funktionieren.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
ademi
Beiträge: 22
Registriert: Mi Sep 25, 2019 3:15 pm

Re: Werte von mehreren Tabellen multiplizieren

Beitrag von ademi »

bigben hat geschrieben: Do Okt 10, 2019 3:02 pm Hallo ademi,

über Fehlermeldungen lässt sich nur sprechen, wenn man den genauen Aufruf der Funktion kennt. Poste bitte eine kleine csv-Datei und das genaue Kommando, mit dem der Fehler entsteht sowie die genaue und vollständige Fehlermeldung.

Die Funktion read.csv und read.table sind übrigens weitgehend identisch. Bei read.csv ist im Wesentlichen nur header = TRUE und sep = "," voreingestellt. row.names sollte bei beiden gleich funktionieren.

LG,
Bernhard
ich habe jetzt versucht, ein paar Beispieldateien durchzuspielen, und diese funktionieren einwandfrei. Ich weiß nicht, wo das Problem bei den eigentlichen Dateien liegt... Für Beispieldateien habe ich die ursprünglichen Dateien genommen, einfach Kopien gemacht und Datensätze reduziert. Nun gut, ich muss da wohl alles neu einspielen.

Jetzt habe ich aber eine andere Frage, und weiß nicht, ob die man hier einfach stellen kann, und zwar
habe ich

Code: Alles auswählen

>ex= fleet*x2stroke
                         X2015 X2016 X2017 X2018 X2019 X2020 X2021 X2022 X2023
UL/VL CC                   651   692   727   748   756   762   762   765   769
Suezmax                    499   522   558   575   597   606   606   601   598
Aframax                    631   643   664   694   705   691   673   650   635
Coated Aframax             287   309   334   350   369   385   400   414   430
Panamax Tanker             408   419   432   444   465   479   493   509   527
Handy Products Tanker     2034  2099  2149  2188  2233  2247  2265  2275  2299
Small Products Tanker        0     0     0     0     0     0     0     0     0
Crude & Products Tankers  6882  7056  7204  7322  7419  7442  7442  7430  7452
Handy Chemical Tanker     1501  1583  1637  1688  1728  1761  1811  1861  1906
Small Chemical Tanker        0     0     0     0     0     0     0     0     0
Chemical Tankers          2799  2886  2927  2970  3010  3076  3166  3265  3356
Handy Misc. Tanker          75    82    85    90    92    92    92    92    93
Small Misc. Tanker           0     0     0     0     0     0     0     0     0
Misc Tankers                 0     0     0     0     0     0     0     0     0
Total Tankers             9998 10264 10455 10624 10766 10856 10949 11038 11155
und

Code: Alles auswählen

> twostroke.kw
                           kW
UL/VL CC                 3270
Suezmax                  2380
Aframax                  2380
Coated Aframax           2380
Panamax Tanker           2380
Handy Products Tanker    1660
Small Products Tanker     870
Crude & Products Tankers   NA
Handy Chemical Tanker     870
Small Chemical Tanker     870
Chemical Tankers           NA
Handy Misc. Tanker        870
Small Misc. Tanker        870
Misc Tankers               NA
Total Tankers              NA

zusammengefügt mit cbind(twostroke.kw, ex)

Code: Alles auswählen

                         kW X2015 X2016 X2017 X2018 X2019 X2020 X2021 X2022
UL/VL CC                 3270   651   692   727   748   756   762   762   765
Suezmax                  2380   499   522   558   575   597   606   606   601
Aframax                  2380   631   643   664   694   705   691   673   650
Coated Aframax           2380   287   309   334   350   369   385   400   414
Panamax Tanker           2380   408   419   432   444   465   479   493   509
Handy Products Tanker    1660  2034  2099  2149  2188  2233  2247  2265  2275
Small Products Tanker     870     0     0     0     0     0     0     0     0
Crude & Products Tankers   NA  6882  7056  7204  7322  7419  7442  7442  7430
Handy Chemical Tanker     870  1501  1583  1637  1688  1728  1761  1811  1861
Small Chemical Tanker     870     0     0     0     0     0     0     0     0
Chemical Tankers           NA  2799  2886  2927  2970  3010  3076  3166  3265
Handy Misc. Tanker        870    75    82    85    90    92    92    92    92
Small Misc. Tanker        870     0     0     0     0     0     0     0     0
Misc Tankers               NA     0     0     0     0     0     0     0     0
Total Tankers              NA  9998 10264 10455 10624 10766 10856 10949 11038
.
Jetzt möchte ich die Daten aggregieren, d.h. Zahlen für Motoren mit gleichen Daten sollen summiert werden mit

Code: Alles auswählen

> aggregate(ex, by=list(ex$kW), sum)
  Group.1   kW X2015 X2016 X2017 X2018 X2019 X2020 X2021 X2022 X2023 X2024 X2025
1     870 4350  1576  1665  1722  1778  1820  1853  1903  1953  1999  2052  2108
2    1660 1660  2034  2099  2149  2188  2233  2247  2265  2275  2299  2312  2327
3    2380 9520  1825  1893  1988  2063  2136  2161  2172  2174  2190  2203  2215
4    3270 3270   651   692   727   748   756   762   762   765   769   777   785
  X2026 X2027 X2028
1  2157  2216  2267
2  2339  2351  2353
3  2229  2246  2248
4   793   800   807
Hat ja auch getan, nur hat R zusätzlich zu Gruppennamen(Spalte 1) auch noch KW (Spalte 2) aggregiert. Was ich möchte ist, dass da nur Gruppennamen bleiben, z.B. 870, 1660, etc. und die zweite Spalte so gar nicht gebildet wird. Ist es möglich?

Liebe Grüße
bigben
Beiträge: 2777
Registriert: Mi Okt 12, 2016 9:09 am

Re: Werte von mehreren Tabellen multiplizieren

Beitrag von bigben »

Du könntest entweder die zweite Spalte kW löschen nach dem aggregieren oder das cbind weglassen und aggregate die Daten von vor dem cbind übergeben oder als erstes Argument nicht alle sondern nur die relevanten Spalten übergeben.
Wenn Du ein lauffähiges komplettes Minimalbeispiel postest, mache ich das auch vor.
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
ademi
Beiträge: 22
Registriert: Mi Sep 25, 2019 3:15 pm

Re: Werte von mehreren Tabellen multiplizieren

Beitrag von ademi »

bigben hat geschrieben: Do Okt 10, 2019 5:44 pm Du könntest entweder die zweite Spalte kW löschen nach dem aggregieren oder das cbind weglassen und aggregate die Daten von vor dem cbind übergeben oder als erstes Argument nicht alle sondern nur die relevanten Spalten übergeben.
Wenn Du ein lauffähiges komplettes Minimalbeispiel postest, mache ich das auch vor.
Guten Morgen Bernhard,

wenn ich das cbind weglasse, wüsste ich nicht, wie ich dann die KW-Daten mit Stückzahlen verbinde. Diese bräuchte ich um die Zahlen zu aggregieren, denn es muss nach Leistung der Motoren erfolgen und nicht nach Schiffsname... Es sei denn, ich füge diese Daten von Anfang dem Datensatz hinzu.
Ich lade zwei .csv Dateien hoch, die dritte wird irgendwie nicht angehängt, aber auch 2 reichen als Beispiel...

Danke!
Dateianhänge
twostroke.engine.kw.csv
(335 Bytes) 21-mal heruntergeladen
Fleet (2).csv
(1.25 KiB) 19-mal heruntergeladen
Antworten