Remplacement des valeurs matriciellesSalut! J'essaie de saisir toutes mes données de colonne dans une matrice de 8 x 12 dans l'ordre (en remplissant d'abord les colonnes de manière descendante). Il n'y a que 72 valeurs dans ma colonne, je veux donc que les valeurs restantes qui ne sont pas remplies soient 0.J'ai beaucoup de problèmes pour essayer de faire fonctionner le code ci-dessous. J'apprécierais toute aide!
dt = Open("Example.jmp");<BR />Rows = nrows(dt);
names= dt << Get Column Names (String);
Table =[];
Table = J(8,12,0);
For(i=1, i <= ncol(dt),i++,
data = column(dt, names[i]) <<GETVALUES></GETVALUES>Re : Remplacement des valeurs matriciellesMerci! cela fonctionne parfaitementRe : Remplacement des valeurs matriciellesJe n'ai pas votre exemple, j'ai donc dû utiliser l'un des exemples de tables de données JMP. Remplacez ces lignes du tableau de données initial par les vôtres.
Names Default to Here( 1 );
// use sample data to illustrate
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
// delete non-numeric data columns
dt << Delete Columns( { :Name, :Sex } );
// make empty container
table = Associative Array();
// get each data column and create (key, value) pair (key = col name, value = 8x12 matrix)
For( c = 1, c <= N Col( dt ), c++,
data = Column( dt, c ) << Get As Matrix;
If( N Row( data ) < 96,
data |/= J( 96 - N Row( data ), 1, 0 );
);
table[Column( dt, c ) << Get Name] = Transpose( Shape( data, 12, 8 ) );
);
Close( dt, No Save );
dir = Get Default Directory();
content = table << Get Contents;
For( t = 1, t <= N Items( content ), t++,
dt = As Table( content[t][2] );
file path = dir || content[t][1] || ".CSV";
dt << Save( file path );
Close( dt, No Save );
text = Load Text File( file path );
eol = Contains( text, "\!n" );
text = Munger( text, 1, eol - 1, content[t][1] );
Save Text File( file path, text );
);Re : Remplacement des valeurs matriciellesJe vous remercie beaucoup pour votre aide. Je l'apprécie. J'ai pu enregistrer le fichier en utilisant votre code, mais actuellement la première ligne du fichier csv est la première ligne de données, il n'y a pas de nom de colonne. J'aimerais que la première cellule ait le nom de la colonne et juste en dessous les données 8 x 12.Re : Remplacement des valeurs matriciellesS'il vous plaît soyez patient. J'ai des difficultés à enregistrer le fichier CSV pour une raison inconnue. Je travaille avec le support technique.
Pendant que j'attends leur réponse, je veux être sûr que vous souhaitez remplacer la première ligne du fichier CSV (en-têtes de colonne de données d'origine) par simplement le nom de la colonne de données d'origine.
Re : Remplacement des valeurs matriciellesCela a fonctionné !! Cependant, je voulais en fait conserver les noms de colonnes (ou dans ce cas content[t][1]) dans le fichier csv comme première ligne. Il ne s'affiche pas actuellement. Savez-vous comment je peux le conserver dans la première cellule du fichier csv ?Re : Remplacement des valeurs matriciellesOk, cette version mise à jour du script devrait faire l'affaire :
Names Default to Here( 1 );
dt = Open( "Example.jmp" );
table = Associative Array();
For( c = 1, c <= N Col( dt ), c++,
data = Column( dt, c ) << Get As Matrix;
If( N Row( data ) < 96,
data |/= J( 96 - N Row( data ), 1, 0 );
);
table[Column( dt, c ) << Get Name] = Transpose( Shape( data, 12, 8 ) );
);
content = table << Get Contents;
For( t = 1, t <= N Items( content ), t++,
dt = As Table( content[t][2] );
Close( dt, Save( content[t][1] || ".CSV" ) );
);
Malheureusement, je ne sais pas comment supprimer la première ligne avec les noms d'en-tête dans les fichiers CSV. Peut-être que quelqu'un d'autre le sait. Nous pourrions immédiatement relire le fichier sous forme de texte, supprimer la première ligne et l'enregistrer à nouveau.
Re : Remplacement des valeurs matriciellesJ'ai besoin de la mise en page de ma configuration et un fichier CSV est le seul type de fichier lu par l'appareilRe : Remplacement des valeurs matriciellesVoir Aide > Index des scripts. Cliquez sur le bouton déroulant et sélectionnez Fonctions. Recherchez la fonction As Table().
Re : Remplacement des valeurs matriciellesJe soupçonne qu'en tant que nouvel utilisateur de JMP, votre état d'esprit pourrait encore être celui d'un utilisateur de feuille de calcul. Je ne connais pas la destination du fichier CSV, mais vous pouvez faire beaucoup de choses dans JMP en utilisant une disposition en table haute.
Pourquoi avez-vous besoin de la mise en page 8x12 ? Pourquoi devez-vous exporter les matrices sous forme de fichiers CSV ?
Nous pourrions peut-être vous aider à utiliser JMP à votre avantage si nous savions où allait cette analyse.
Re : Remplacement des valeurs matriciellesVeuillez jeter un oeil à ce post . Cela pourrait vous être utile dans votre travail avec des expériences sur des plaques.
Re : Remplacement des valeurs matriciellesJe suis peut-être un peu redondant, mais voici une autre façon de gérer cela étant donné la nécessité de générer un fichier csv.Il utilise la manipulation de la table de données pour mettre les données sous la forme correcte, puis écrit la table de données dans un fichier CSV.
Names Default To Here( 1 );
// Create some sample data
dt = New Table( "Example",
add rows( 72 ),
New Column( "c1", formula( Random Uniform( 1, 500 ) ) ),
New Column( "c2", formula( Random Uniform( 1, 500 ) ) ),
New Column( "c3", formula( Random Uniform( 1, 500 ) ) )
);
dt << run formulas;
dt:c1 << delete property( "formula" );
dt:c2 << delete property( "formula" );
dt:c3 << delete property( "formula" );
// Get the list of columns
colNamesList = dt << get column names( string, numeric );
// Loop across the columns and process them
For( i = 1, i <= N Cols( dt ), i++,
// Create a new table will only the single column
dtTemp = dt << subset(invisible, selected rows( 0 ), columns( Column( colNamesList[i] ) ) );
// If there are not 96 rows, add them
If( N Rows( dtTemp ) < 96,
rowCount = N Rows( dt );
dtTemp << add rows( 96 - rowCount );
For( k = rowCount + 1, K <= 96, k++,
Column( dtTemp, colNamesList[i] )[k] = 0
);
);
// Create a sequence column to allow for proper splitting of the data
dtTemp << New Column( "sequence",
formula(
x = Mod( Row(), 8 );
If( x == 0, x = 8 );
x;
)
);
dtTemp << run formulas;
// Split the data into 8 columns.....if this should be 12 just change the sequence formula above
dtSplit = dtTemp << Split(invisible, Split By( :sequence ), Split( Column( dtTemp, colNamesList[i] ) ), Sort by Column Property );
dtSplit << run formulas;
// Close the un needed temporary data table
Close( dtTemp, nosave );
// Change the output preferences to get rid of headers
current_pref = Char( Arg( Parse( (Char( Get Preferences( Export settings ) )) ), 1 ) );
// Set prefs (comma delimited, no headers)
Pref( Export Settings( End Of Field( Comma ), Export Table Headers( 0 ) ) );
// Save csv file
dtSplit << save( "$TEMP\" || colNamesList[i] || ".csv" );
//Restore oribinal prefs
Eval( Parse( "pref(" || current_pref || ")" ) );
// Close the un necessary table
Close( dtSplit, nosave );
);
Re : Remplacement des valeurs matriciellesMerci pour votre aide et votre intérêt. La méthode des tableaux associatifs de Mark Bailey a fonctionné. J'essaie maintenant de comprendre comment placer le tableau associatif dans une table de données afin de pouvoir l'exporter sous forme de fichier CSV.Re : Remplacement des valeurs matriciellesDonc, une fois que vous avez les données dans les matrices, comment les déplacer vers les emplacements permanents ?Re : Remplacement des valeurs matriciellesJe m'excuse pour la confusion. J'essaie de stocker chacune de mes données de colonne dans un format de 8 x 12 (qui correspond à la taille d'une plaque de micro-titrage à 96 puits), afin de stocker les résultats de mes expériences en corrélation avec son emplacement sur la plaque. . Chaque colonne représente une expérience différente.Re : Remplacement des valeurs matriciellesJe suis cette discussion depuis le début.Il semble avoir évolué vers un exercice de script, sans exposer quel est le véritable objectif final. @Mark_Bailey a fourni une solution intéressante avec son utilisation d'un tableau associatif, mais ce qui me manque, c'est quelle est la véritable raison de la création de ces matrices ?Si cela était connu, il existerait peut-être une solution plus simple.
Re : Remplacement des valeurs matriciellesLes noms de colonnes sont stockés dans le tableau associatif. Ce sont les clés. Vous pouvez vérifier cette affirmation en ajoutant ceci au script :
Show( table << Get Keys );
Je vous suggère de consulter Aide > Livres > Guide de script, puis de rechercher « tableau associatif ». Vous pouvez parcourir les paires et effectuer facilement de nombreuses autres tâches. Les exemples du guide sont bons, mais revenez ici si vous avez des questions.
Re : Remplacement des valeurs matriciellesMerci!! Cela fonctionne bien. Toutefois, le nom de la colonne n'est pas stocké. Savez-vous comment je pourrais résoudre ce problème ?Re : Remplacement des valeurs matriciellesVos colonnes de données correspondent-elles aux résultats d'une plaque de microtitration ?
Vous souhaitez remodeler les données de chaque colonne dans un tableau 8x12. Votre script ne conservera le tableau que pour la dernière colonne. Voici un script qui traite chaque colonne de données et stocke le résultat du tableau avec le nom de la colonne dans un tableau associatif.
Names Default to Here( 1 );
dt = Open( "Example.jmp" );
table = Associative Array();
For( c = 1, c <= N Col( dt ), c++,
data = Column( dt, c ) << Get As Matrix;
data[Loc(Is Missing( data ))] = 0;
table[Column( dt, c ) << Get Name] = Transpose( Shape( data, 12, 8 ) );
);
Show( table << Get Contents );
Je suppose que vous avez au moins 96 lignes. S’il y en a plus, ils sont perdus. S'il y en a moins, alors l'affectation de 0 doit être remplacée par une concaténation qui se complète avec 0. Cette version complète à la place :
Names Default to Here( 1 );
dt = Open( "Example.jmp" );
table = Associative Array();
For( c = 1, c <= N Col( dt ), c++,
data = Column( dt, c ) << Get As Matrix;
If( N Row( data ) < 96,
data |/= J( 96 - N Row( data ), 1, 0 );
)
table[Column( dt, c ) << Get Name] = Transpose( Shape( data, 12, 8 ) );
);
Show( table << Get Contents );
Re : Remplacement des valeurs matriciellesMerci pour votre aide! Puis-je utiliser la fonction Get As Matrix pour placer les données dans une matrice avec des spécifications ? J'ai besoin que les données de la colonne entrent dans une matrice 8 x 12.Re : Remplacement des valeurs matriciellesmerci pour la réponse Jim! le tableau de données comporte actuellement 5 colonnes, mais cela peut changer en fonction de la saisie de l'utilisateur. J'essaie essentiellement de mettre une colonne de données dans une matrice de 12 colonnes et 8 lignes.
(a - 1) * b + b ne semble pas fonctionner pour moi, je suppose parce que pour la première colonne de données, ce sera toujours data[0]. Savez-vous ce qui ne va pas ?Re : Remplacement des valeurs matriciellesJim propose une très bonne solution mais je ne suis pas sûr non plus de ce que vous voulez faire, je propose donc une autre façon d'illustrer un autre point.
Names Default to Here( 1 );
// open example
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
// make illustrative example with colums of different sizes (missing values)
dt2 = dt1 << Split(
Split By( :age ),
Split( :weight ),
Remaining Columns( Drop All ),
Sort by Column Property
);
Close( dt1, No Save );
// input data table as matrix
mat = dt2 << Get As Matrix;
// replace missing values with zero
mat[Loc(Is Missing(mat))] = 0;
// see result
Show( mat );
J'espère que cela aide.
Re : Remplacement des valeurs matriciellesJe ne suis vraiment pas sûr de comprendre ce que vous essayez de faire.Mais ci-dessous se trouve un script qui remplira les zéros une fois que la matrice appelée data sera à court de valeurs.
dt = Open( "Example.jmp" );
Rows = N Rows( dt );
names = dt << Get Column Names( String );
Table = [];
Table = J( 8, 12, 0 );
For( i = 1, i <= N Col( dt ), i++,
data = Column( dt, names[i] ) << getValues;
For( a = 1, a <= 12, a++,
For( b = 1, b <= 8, b++,
// I believe that (a - 1 ) * b + b will be equal to the
// row number of the data matrix you read in. Once it's
// value is greater than the number of rows in the dt data
// table, it will enter zeros.
If( (a - 1) * b + b <= Rows,
Table[a, b] = data[(a - 1) * b + b],
Table[a, b] = 0
)
)
);
);
Print( Table );
Je ne comprends pas ce que vous faites avec la boucle externe For(), allant de colonne en colonne.Combien de colonnes y a-t-il dans l'exemple de table de données ?