Matrixwerte ersetzenHallo! Ich versuche, alle meine Spaltendaten der Reihe nach in eine 8 x 12-Matrix einzugeben (die Spalten zuerst nach unten ausfüllen). Meine Spalte enthält nur 72 Werte, daher möchte ich, dass die verbleibenden, nicht ausgefüllten Werte 0 sind.Ich habe große Probleme damit, den folgenden Code zum Laufen zu bringen. Ich würde mich über jede Hilfe freuen!
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>Betreff: Matrixwerte ersetzenDanke schön! das funktioniert perfektBetreff: Matrixwerte ersetzenDa ich Ihr Beispiel nicht habe, musste ich eine der JMP-Beispieldatentabellen verwenden. Ersetzen Sie diese Zeilen für die anfängliche Datentabelle durch Ihre eigenen.
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 );
);Betreff: Matrixwerte ersetzenVielen Dank für deine Hilfe. Ich schätze es. Ich konnte die Datei mit Ihrem Code speichern, aber derzeit ist die erste Zeile der CSV-Datei die erste Datenzeile, es gibt keinen Spaltennamen. Ich möchte, dass die erste Zelle den Namen der Spalte und direkt darunter die 8 x 12 Daten enthält.Betreff: Matrixwerte ersetzenBitte haben Sie Geduld. Ich habe aus unbekanntem Grund Schwierigkeiten beim Speichern der CSV-Datei. Ich arbeite mit dem technischen Support zusammen.
Während ich auf ihre Antwort warte, möchte ich sicherstellen, dass Sie die erste Zeile der CSV-Datei (ursprüngliche Datenspaltenüberschriften) nur durch den Namen der ursprünglichen Datenspalte ersetzen möchten.
Betreff: Matrixwerte ersetzenDas hat funktioniert!! Allerdings wollte ich eigentlich die Spaltennamen (oder in diesem Fall content[t][1]) in der CSV-Datei als erste Zeile beibehalten. Es wird derzeit nicht angezeigt. Wissen Sie, wie ich es in der ersten Zelle der CSV-Datei behalten kann?Betreff: Matrixwerte ersetzenOk, diese aktualisierte Version des Skripts sollte den Zweck erfüllen:
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" ) );
);
Leider weiß ich nicht, wie ich in den CSV-Dateien die erste Zeile mit den Headernamen unterdrücken kann. Vielleicht weiß es jemand anderes. Wir könnten die Datei sofort als Text zurücklesen, die erste Zeile löschen und sie erneut speichern.
Betreff: Matrixwerte ersetzenIch benötige das Layout für mein Setup und eine CSV-Datei ist der einzige Dateityp, der vom Gerät gelesen wirdBetreff: Matrixwerte ersetzenSiehe Hilfe > Skriptindex. Klicken Sie auf die Dropdown-Schaltfläche und wählen Sie Funktionen aus. Suchen Sie nach der Funktion „As Table()“.
Betreff: Matrixwerte ersetzenIch vermute, dass Sie als neuer JMP-Benutzer immer noch die Denkweise eines Tabellenkalkulationsbenutzers haben. Ich kenne das Ziel der CSV-Datei nicht, aber Sie können in JMP mit einem hohen Tabellenlayout viel tun.
Warum benötigen Sie das 8x12-Layout? Warum müssen Sie die Matrizen als CSV-Dateien exportieren?
Wir könnten Ihnen möglicherweise helfen, JMP zu Ihrem Vorteil zu nutzen, wenn wir wüssten, wohin diese Analyse führt.
Betreff: Matrixwerte ersetzenBitte werfen Sie einen Blick darauf dieser Beitrag . Es könnte Ihnen bei Ihrer Arbeit mit Experimenten auf Tellern nützlich sein.
Betreff: Matrixwerte ersetzenIch bin vielleicht etwas überflüssig, aber hier ist eine alternative Möglichkeit, damit umzugehen, da die Ausgabe in eine CSV-Datei erforderlich ist.Es verwendet die Datentabellenmanipulation, um die Daten in die richtige Form zu bringen, und schreibt die Datentabelle dann in eine CSV-Datei
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 );
);
Betreff: Matrixwerte ersetzenVielen Dank für Ihre Hilfe und Ihr Interesse. Die assoziative Array-Methode von Mark Bailey hat funktioniert. Jetzt versuche ich herauszufinden, wie ich das assoziative Array in eine Datentabelle einfügen kann, damit ich es als CSV-Datei exportieren kann.Betreff: Matrixwerte ersetzenSobald Sie also die Daten in den Matrizen haben, wie verschieben Sie sie an die permanenten Speicherorte?Betreff: Matrixwerte ersetzenIch entschuldige mich für die Verwirrung. Ich versuche, alle meine Säulendaten in einem Format von 8 x 12 zu speichern (was der Größe einer Mikrotiterplatte mit 96 Vertiefungen entspricht), um die Ergebnisse meiner Experimente in Korrelation zu ihrer Position auf der Platte zu speichern . Jede Spalte stellt ein anderes Experiment dar.Betreff: Matrixwerte ersetzenIch verfolge diese Diskussion von Anfang an.Es scheint sich zu einer Skriptübung entwickelt zu haben, ohne das eigentliche Endziel offenzulegen. @Mark_Bailey hat mit der Verwendung eines assoziativen Arrays eine gute Lösung bereitgestellt, aber was meiner Meinung nach fehlt, ist, was der wahre Grund für die Erstellung dieser Matrizen ist?Wenn das bekannt wäre, gäbe es vielleicht eine einfachere Lösung.
Betreff: Matrixwerte ersetzenDie Spaltennamen werden im assoziativen Array gespeichert. Sie sind die Schlüssel. Sie können diese Behauptung überprüfen, indem Sie Folgendes zum Skript hinzufügen:
Show( table << Get Keys );
Ich schlage vor, dass Sie „Hilfe“ > „Bücher“ > „Skripthandbuch“ aufrufen und dann nach „assoziatives Array“ suchen. Sie können die Paare durchlaufen und viele andere Aufgaben problemlos erledigen. Die Beispiele im Leitfaden sind gut, aber kehren Sie hierher zurück, wenn Sie Fragen haben.
Betreff: Matrixwerte ersetzenDanke schön!! Das funktioniert gut. Der Spaltenname wird jedoch nicht gespeichert. Weißt du, wie ich das beheben könnte?Betreff: Matrixwerte ersetzenSind Ihre Datenspalten für die Ergebnisse einer Mikrotiterplatte?
Sie möchten die Daten in jeder Spalte in eine 8x12-Tabelle umformen. Ihr Skript behält nur die Tabelle für die letzte Spalte. Hier ist ein Skript, das jede Datenspalte verarbeitet und das Tabellenergebnis mit dem Spaltennamen in einem assoziativen Array speichert.
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 );
Ich gehe davon aus, dass Sie mindestens 96 Zeilen haben. Sind es mehr, gehen sie verloren. Wenn es weniger sind, sollte die Zuweisung von 0 in eine Verkettung geändert werden, die mit 0 aufgefüllt wird. Diese Version füllt stattdessen auf:
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 );
Betreff: Matrixwerte ersetzenIch danke Ihnen für Ihre Hilfe! Kann ich die Funktion „Als Matrix abrufen“ verwenden, um die Daten in eine Matrix mit Spezifikationen einzufügen? Ich benötige die Daten aus der Spalte, um sie in eine 8 x 12-Matrix einzufügen.Betreff: Matrixwerte ersetzenDanke für die Antwort, Jim! Die Datentabelle hat derzeit 5 Spalten, sie kann sich jedoch je nach Benutzereingabe ändern. Ich versuche im Grunde, eine Datenspalte in eine Matrix mit 12 Spalten und 8 Zeilen einzufügen.
(a - 1) * b + b scheint bei mir nicht zu funktionieren, ich vermute, weil es für die erste Spalte data immer data[0] sein wird. Wissen Sie, was falsch läuft?Betreff: Matrixwerte ersetzenJim bietet eine sehr gute Lösung, aber ich bin mir auch nicht sicher, was Sie tun möchten, deshalb biete ich eine andere Möglichkeit an, um einen anderen Punkt zu veranschaulichen.
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 );
Ich hoffe es hilft.
Betreff: Matrixwerte ersetzenIch bin mir wirklich nicht sicher, ob ich verstehe, was Sie tun wollen.Aber unten ist ein Skript, das Nullen füllt, nachdem die Matrix namens „data“ keine Werte mehr hat
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 );
Ich bin verwirrt darüber, was Sie mit der äußeren For()-Schleife machen, die von Spalte zu Spalte geht.Wie viele Spalten enthält die Beispieldatentabelle?