Wie multipliziere ich zwei Tabellen miteinander?Ich habe eine Big-Data-Tabelle und eine Normalisierungsfaktortabelle.
Die Datentabelle sieht folgendermaßen aus:
| ICH WÜRDE | Art | Parameter1 | Parameter2 | Parameter3 |
| 01 | 1 | Daten | Daten | Daten |
| 02 | 1 | Daten | Daten | Daten |
| 03 | 2 | Daten | Daten | Daten |
| 04 | 2 | Daten | Daten | Daten |
Die Normalisierungsfaktortabelle sieht folgendermaßen aus:
| Art | Parameter1 | Parameter2 | Parameter3 |
| 1 | Normalisierungsfaktor1 | Normalisierungsfaktor2 | Normalisierungsfaktor3 |
| 2 | Normalisierungsfaktor4 | Normalisierungsfaktor5 | Normalisierungsfaktor6 |
Wie kann ich die erste Tabelle mit der zweiten Tabelle basierend auf Typ und Parameter multiplizieren und eine neue Tabelle wie diese erhalten:
| ICH WÜRDE | Art | Parameter1 | Parameter2 | Parameter3 |
| 01 | 1 | Daten * Normalisierungsfaktor1 | Daten * Normalisierungsfaktor2 | Daten * Normalisierungsfaktor3 |
| 02 | 1 | Daten * Normalisierungsfaktor1 | Daten * Normalisierungsfaktor2 | Daten * Normalisierungsfaktor3 |
| 03 | 2 | Daten * Normalisierungsfaktor4 | Daten * Normalisierungsfaktor5 | Daten * Normalisierungsfaktor6 |
| 04 | 2 | Daten * Normalisierungsfaktor4 | Daten * Normalisierungsfaktor5 | Daten * Normalisierungsfaktor6 |
Meine Rohdatentabelle ist sowohl in Zeilen als auch in Spalten sehr groß, daher möchte ich eine schnelle Lösung.
Vielen Dank.
DatentabelleSkriptingBetreff: Wie multipliziere ich zwei Tabellen miteinander?Sie können einen virtuellen Join und Formelspalten verwenden.
Virtual Join fügt die blauen und goldenen Schlüssel hinzu
Sie können sie interaktiv oder mit JSL verknüpfen.
Dies kann JMP16-Namen mit dem verwenden : "parameter3 [Typ]" n Syntax; Möglicherweise benötigen Sie einen Namen ( "parameter3 [Typ]" ) stattdessen.
// make example tables. **save them** so virtual join works.
factorDT = New Table( "Imported Data 2",
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 1.2] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0.8, 0.9] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 0.9] ) )
);
factorDT << save( "$temp/factor.jmp" );
dataDT = New Table( "Imported Data",
New Column( "ID", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 1, 2, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 3, 2, 1] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 3, 3, 2] ) )
);
dataDT << save( "$temp/data.jmp" );
// join the tables
factorDT:type << Set Property( "Link ID", 1 );
dataDT:type << Set Property( "Link Reference", Reference Table( "factor.jmp" ) );
// add formula columns
dataDT << New Column( "p 1", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter1[Type]"n * :parameter1 ) );
dataDT << New Column( "p 2", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter2[Type]"n * :parameter2 ) );
dataDT << New Column( "p 3", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter3[Type]"n * :parameter3 ) );
// force the evaluation to complete
dataDT<<RUNFORMULAS></RUNFORMULAS>
Betreff: Wie multipliziere ich zwei Tabellen miteinander?Und wenn Sie die Formeln nicht benötigen, können Sie eine elementweise Multiplikation von Matrizen in Betracht ziehen, die möglicherweise "besser" ist oder nicht. Auf meinem MacBook dauerte der folgende Code ungefähr 15 Sekunden.
NamesDefaultToHere(1);
nr = 10000; // Number of rows
nc = 10000; // Number of Columns
dt1 = AsTable(J(nr, nc, RandomInteger(1, 20)));
dt2 = AsTable(J(nr, nc, RandomUniform(0, 1)));
m1 = dt1 << getAsMatrix;
m2 = dt2 << getAsMatrix;
dtFinal = AsTable(m1 :*</img> m2);
Betreff: Wie multipliziere ich zwei Tabellen miteinander?Danke für Ihre Antwort. Ich habe jedoch viele Spalten und Spaltennamen sind kompliziert. Daher möchte ich eine for-Schleife schreiben, um neue Spalten zu erstellen. Können Sie diese Aussage näher erläutern?
Formula( :"parameter1[Type]"n * :parameter1 )
Ich denke darüber nach, eine for-Schleife wie diese zu schreiben:
</CODE></PRE><PRE class="lia-code-sample language-markup"><CODE>colnames = dataDT << Get Column Names();
nc = ncols(dataDT);
DT = New Table("normalized", New Column("ID", values(dataDT:ID << get values)),
New Column("Type", values(dataDT:Type << get values)));
For(i = 3, i<= nc, i++,
DT << New Column( char( colnames[3]), Numeric, "Continuous", Format( "Best", 12 ), Formula( XXXX ) ));Aber ich weiß nicht, wie ich die Formel richtig konstruieren soll . Es gibt mir immer wieder Fehler. Kannst du mir helfen?
Vielen Dank.
Betreff: Wie multipliziere ich zwei Tabellen miteinander?Vielen Dank, es funktioniert mit einem kleinen Datensatz. Aber ich habe Millionen von Zeilen in Tabelle 1 und nur zwei Zeilen in Tabelle 2. Deshalb möchte ich vermeiden, eine weitere große Tabelle zu erstellen. Wenn ich keine bessere Lösung finde, werde ich diese Methode ausprobieren.
Betreff: Wie multipliziere ich zwei Tabellen miteinander?Die Schleife ist nicht einfach; Ich denke, das wird es tun:
// make example tables. **save them** so virtual join works.
factorDT = New Table( "Imported Data 2",
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 1.2] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0.8, 0.9] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 0.9] ) )
);
factorDT << save( "$temp/factor.jmp" );
dataDT = New Table( "Imported Data",
New Column( "ID", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 1, 2, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 3, 2, 1] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 3, 3, 2] ) )
);
dataDT << save( "$temp/data.jmp" );
originalColumns = dataDT<<GETCOLUMNNAMES></GETCOLUMNNAMES>
- Erfassen Sie die ursprünglichen Spalten, bevor Sie die ausgeblendeten Spalten mit virtueller Verknüpfung hinzufügen
- Erstellen Sie den Ausdruck e mit \! ", um die eingebetteten Anführungszeichen zu umgehen
- Verwenden Sie write (), um Ihre Arbeit zu debuggen, nicht print
- << RunFormulas ist wichtig für die Geschwindigkeit; Die Standard-Hintergrundauswertung von Spaltenformeln ist viel langsamer