Comment multiplier deux tableaux ensembleJ'ai un tableau Big Data et un tableau des facteurs de normalisation.
La table de données ressemble à ceci:
| identifiant | Taper | paramètre1 | paramètre2 | paramètre3 |
| 01 | 1 | Les données | Les données | Les données |
| 02 | 1 | Les données | Les données | Les données |
| 03 | 2 | Les données | Les données | Les données |
| 04 | 2 | Les données | Les données | Les données |
Le tableau des facteurs de normalisation ressemble à ceci:
| Taper | paramètre1 | paramètre2 | paramètre3 |
| 1 | facteur de normalisation1 | facteur de normalisation2 | facteur de normalisation3 |
| 2 | facteur de normalisation4 | facteur de normalisation5 | facteur de normalisation6 |
Comment puis-je multiplier la première table par la deuxième table en fonction du type et du paramètre et obtenir une nouvelle table comme celle-ci:
| identifiant | Taper | paramètre1 | paramètre2 | paramètre3 |
| 01 | 1 | données * facteur de normalisation1 | données * facteur de normalisation2 | données * facteur de normalisation3 |
| 02 | 1 | données * facteur de normalisation1 | données * facteur de normalisation2 | données * facteur de normalisation3 |
| 03 | 2 | données * facteur de normalisation4 | données * facteur de normalisation5 | données * facteur de normalisation6 |
| 04 | 2 | données * facteur de normalisation4 | données * facteur de normalisation5 | données * facteur de normalisation6 |
Ma table de données brutes est énorme en lignes et en colonnes, je veux donc une solution rapide.
Merci beaucoup.
Tableau de donnéesScriptingRe: Comment multiplier deux tableaux ensembleVous pouvez utiliser une jointure virtuelle et des colonnes de formule.
La jointure virtuelle ajoute les clés bleues et dorées
Vous pouvez les lier de manière interactive ou avec JSL.
Cela peut utiliser des noms JMP16 avec le : "paramètre3 [Type]" n syntaxe; vous pourriez avoir besoin d'un nom ( "paramètre3 [Type]" ) au lieu.
// 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>
Re: Comment multiplier deux tableaux ensembleEt si vous n'avez pas besoin des formules, vous pouvez envisager la multiplication élément par élément des matrices qui peuvent ou non être «meilleures». Sur mon MacBook, le code ci-dessous a pris environ 15 secondes.
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);
Re: Comment multiplier deux tableaux ensembleMerci pour votre réponse. Cependant, j'ai de nombreuses colonnes et les noms de colonnes sont compliqués. Par conséquent, je veux écrire une boucle for pour créer de nouvelles colonnes. Pouvez-vous expliquer plus sur cette déclaration?
Formula( :"parameter1[Type]"n * :parameter1 )
Je pense à écrire une boucle for comme celle-ci:
</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 ) ));Mais je ne sais pas comment construire correctement la formule . Cela ne cesse de me donner des erreurs. Pouvez-vous m'aider?
Merci.
Re: Comment multiplier deux tableaux ensembleMerci, cela fonctionne sur un petit jeu de données. Mais j'ai des millions de lignes dans le tableau 1 et seulement deux lignes dans le tableau 2. Par conséquent, je veux éviter de créer une autre grande table. Si je ne trouve pas de meilleure solution, j'essaierai cette méthode.
Re: Comment multiplier deux tableaux ensembleLa boucle n'est pas facile; Je pense que ça va le faire:
// 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>
- capturer les colonnes d'origine avant d'ajouter les colonnes cachées avec jointure virtuelle
- construire l'expression e en utilisant \! "pour échapper les guillemets incorporés
- utilisez write () pour déboguer votre travail, pas pour imprimer
- << RunFormulas est important pour la vitesse; l'évaluation d'arrière-plan par défaut des formules de colonnes est beaucoup plus lente