Verschieben einer Teilmenge von Daten von einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungEs tut mir leid, dass ich das noch einmal gepostet habe. Ich habe Teile meines Workflows hier maskiert, um Hilfe zu erhalten, und ich habe immer noch Probleme. Ich habe Schwierigkeiten, die Antworten zu überprüfen, da ich schlechte Erfahrungen damit gemacht habe, dass StackOverflow angeschrien wird, und das ohne wirklichen Grund. Ich bin sicher, dass die Narben mit der Zeit heilen werden. Wie auch immer, ich bin in der Nähe und werde irgendwann auf Ihre Antworten eingehen.
Um zum technischen Punkt zu gelangen:
Ich versuche, die Daten, an denen einige Proben ausgeführt wurden (jede Probe sollte dreimal ausgeführt worden sein, vorausgesetzt, dass während des Laborteils des Projekts, für den ich nicht da war, alles gut lief), in drei separate Spalten einer Manifestdatei zu kopieren Hier werden die laufenden Metadaten für unser Projekt nach meinen Erkenntnissen nachverfolgt, sodass jede Spalte eine Instanz der Datenerfassung darstellt. Es gibt mehrere Spender mit jeweils einer Spender-ID und eine gewisse Redundanz in den Daten, z. B. mehrere Erfassungskanäle auf dem Instrument für den "gleichen Datenpunkt" (hängt davon ab, wie Sie ihn betrachten), obwohl ich denke, dass dies der Fall sein sollte.
Hier ist mein Pseudocode, an dem ich arbeiten wollte, und er war bisher rau. Ich weiß nicht warum. Ich bin kein erfahrener Informatiker, Entwickler oder Softwareentwickler. Jede Hilfe wird geschätzt.
DataTypes:
(associative array) DonorID{
(key) Month1: (value) date1 (empty at start)
(key) Month2: (value) date2 (empty at start)
(key) Month3: (value) date3 (empty at start)
}
find unique donor IDs in data
for each donor ID{
get (i.e. subset) data keyed on donor ID;
for Month in 1, 2, 3 (strings){
if no date in donorID associative array{
add date from data;
}else if date already{
is the date in the data table cell the same as in the associative array entry?
if yes, do nothing (indicates different target channel)
if no, ping user
Multiple run dates for same data point is a problem.
}
}
}
Copy from data to manifest:
loop over DonorID associative array:
for each donorID:
in Month 1, 2, or 3:
add date1 2 or 3 to "Actual Month [1, 2, or 3] Stability Test Date" in manifest
donorID is still row identifier
date (1, 2, or 3) is now column identifierSkriptingBetreff: Verschieben einer Teilmenge von Daten von einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungHallo,
Willkommen in der Community! Es tut mir leid, dass Sie in anderen Foren negative Erfahrungen gemacht haben, als Sie um Hilfe gebeten haben. Während die JMP-Benutzergemeinschaft ein einladender und hilfreicher Ort ist, gibt es einige "Best Practices", die Ihre Chancen maximieren sollten, die gewünschten Informationen zu erhalten.
Spezifische, allgemeinere Fragen zu stellen, ist der richtige Weg, wenn Sie es schaffen - obwohl mir klar ist, dass man manchmal "nicht weiß, was er nicht weiß". Das Posten eines beträchtlichen Teils des Pseudocodes kann die Leute abschrecken ... Wenn Sie Ihre Frage auf keine andere Weise stellen können, ist es sehr hilfreich, eine "Vorher" - und "Nachher" -Datei - und Screenshots - anzuhängen, damit die Betrachter konkrete Informationen erhalten Beispiele für eine "Start" -Tabelle (oder Textdaten) und eine "Ziel" -Tabelle. Dies würde in diesem speziellen Fall definitiv einen echten Unterschied machen. Wenn Sie die Datensätze "bereinigen" müssen, ist das in Ordnung (am besten wirklich). Solange der Punkt, den Sie veranschaulichen möchten, noch gemacht werden kann, ist alles gut.
Wenn Sie spezifische, zielgerichtete Fragen stellen und illustrative Dateien und Screenshots hinzufügen, werden wahrscheinlich viele hier einspringen, um zu helfen. Ich kann mir mehr als ein paar nebenbei vorstellen, die dem nicht wirklich widerstehen können!
Prost,
Brady
Betreff: Verschieben einer Teilmenge von Daten von einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungDanke, Brady.Betreff: Verschieben einer Teilmenge von Daten von einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungHallo allerseits. Hier ist mein Code bisher:
Names Default To Here( 1 );
dt_data = Open( "[filepath, no issues here]" );
dt_manifest = Open( "[filepath, no issues here]" );
Summarize( dt_data, IDs = by( :ID ) ); //this finds all the unique IDs in the data file, which we will need //[no issues here]
//First, populate the temporary data structure--associative array--from the data file which we will then copy over to the manifest file.
For( i = 1, i <= N Items( IDs ), i++,
ID = IDs[i];
data_array = Associative Array( {"data1", "data2", "data3"}, {{}, {}, {}} ); //it appears in the print statements we get 3 copies, indicating this loop works
For( data = data_array << First, !Is Empty( data ), data = data_array << Next( data ), //looping through data_array's keys is clunky but done this way in JMP
Write( ID ); //just a check; works
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data); //does not work
//...continue with further code to transfer from LBCM_array to manifest
);
);Ich habe es so geschrubbt, dass es vertraulich ist (keine Sorge, Unternehmensinformationen auszuspionieren;)), während Struktur und Informationen beibehalten werden (Name 'a' Name, Etikett zu Etikett).
Mein Problem ist im Moment mit dieser Zeile:
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
Es wird die Fehlermeldung ausgegeben
.
Name Unresolved: Run date in access or evaluation of 'Run date' , :Run date/*###*/
In the following script, error marked by /*###*/
...
data_array[data] = :Run date/*###*/ <<WHERE></WHERE>
: Das Ausführungsdatum ist eine Datenspalte (Header) in meiner Datentabelle (insbesondere dt_data) mit den Ausführungsdaten des Experiments. Ich versuche, diese in die zweite Datei zu übertragen, da jeder Datenpunkt dreimal / dreimal hätte gesammelt werden müssen. Deshalb hat data_array bei der Initialisierung drei Schlüssel und drei leere Werte. Hier gehen die Daten hin, dieses assoziative Array (data_array). Es wird dann an dt_manifest übertragen, aber das ist für später, sobald dieser Teil funktioniert.
Im Moment habe ich anscheinend Probleme beim Zugriff in der Leitung
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
die passende Auswahl an Zeilen und Spalten, die mich interessieren. Ist die Problemstellung zu diesem Zeitpunkt klar genug, damit sich jeder im Publikum einschalten und eine Lösung oder einen Beitrag dazu anbieten kann, wie syntaktisch (und möglicherweise semantisch) korrekter angegeben werden kann, wie die Teilmenge der Daten ausgewählt werden soll, die ich bin? interessiert an (von data_dt)?
Mach dir keine Sorgen über das Transponierungsproblem. Ich werde mich später darum kümmern, und ich denke ehrlich, es sollte ziemlich einfach sein, wenn sich die Daten in einem aa (assoziatives Array) befinden. An diesem Punkt lerne ich noch, wie man Zeilen- / Spaltenauswahl, Teilmengen von Datentabellen usw. im Zusammenhang mit Problemen bearbeitet.
Noch ein Hinweis: Wenn es seltsam erscheint, dass Daten, Daten und Arrays verwechselt werden, liegt dies höchstwahrscheinlich daran, dass ich schlechte Namen für die Scrubbing- / Anonymisierungstitel / Beschriftungen der Datenspalten oder relevanten Dateneinheiten ausgewählt habe, um die Geheimnisse meines Unternehmens zu schützen. Ich bin immer noch ein Neuling in diesem ganzen Prozess, würde ich sagen, und ich ziehe es vor, auf der sicheren Seite zu irren.
Ich werde von meinem Ende an weiter an dem Problem arbeiten.
Vielen Dank,
Mike
Betreff: Verschieben einer Teilmenge von Daten von einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungMike,
Ich habe noch ein wenig verloren, warum Sie ein assoziatives Array verwenden möchten, aber ich glaube, dass der folgende Code in das Array verschoben wird, die Datumswerte für die 3 Messzeilen für jede ID.Ich habe einige Daten zusammengestellt, von denen ich hoffe, dass sie dem Layout Ihrer Daten ähneln.Ich vermute nur basierend auf Ihren Aussagen und der Verwendung von Code.

Hier ist das Skript.Die obige Datentabelle wird am Anfang des Skripts generiert, sodass der Mut Ihres Codes mit meinen Änderungen unter der Generierung der Datentabelle liegt.
Names Default To Here( 1 );
dt_data = New Table( "Example",
Add Rows( 6 ),
New Column( "ID", Character, "Nominal", Set Values( {"A", "A", "A", "B", "B", "B"} ) ),
New Column( "Run Date",
Numeric,
"Continuous",
Format( "m/d/y", 12 ),
Input Format( "m/d/y" ),
Set Values( [3692304000, 3694982400, 3697401600, 3700080000, 3702672000, 3705350400] )
),
New Column( "TimePoint", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [., ., ., ., ., .] ) )
);
//dt_manifest = Open( "[filepath, no issues here]" );
Summarize( dt_data, IDs = by( :ID ) ); //this finds all the unique IDs in the data file, which we will need //[no issues here]
//First, populate the temporary data structure--associative array--from the data file which we will then copy over to the manifest file.
For( i = 1, i <= N Items( IDs ), i++,
ID = IDs[i];
theRows = dt_data << get rows where( :ID == ID );
data_array = Associative Array( {"data1", "data2", "data3"}, {{}, {}, {}} );
k=0;
For( data = data_array << First, !Is Empty( data ), data = data_array << Next( data ), //looping through data_array's keys is clunky but done this way in JMP
k++;
show( ID ); //just a check; works
data_array[data] = :Run date[theRows[k]];
//...continue with further code to transfer from LBCM_array to manifest
);
show(data_array);
);
Die Ergebnisse des Codes werden im Protokoll aufgelistet
ID = "A";
ID = "A";
ID = "A";
data_array = ["data1" => 3692304000, "data2" => 3694982400, "data3" => 3697401600];
ID = "B";
ID = "B";
ID = "B";
data_array = ["data1" => 3700080000, "data2" => 3702672000, "data3" => 3705350400];
Die Zahlen im data_array sind die numerischen Werte für die Ausführungsdaten.
Betreff: Verschieben einer Teilmenge von Daten von einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungHallo,
Du schreibst:
Mein Problem ist im Moment mit dieser Zeile:
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
Ich sehe ein paar mögliche Probleme ... achten Sie darauf, diese zu untersuchen:
1): Das Ausführungsdatum bezieht sich, wie geschrieben, auf eine Spalte in der Datentabelle, die zum Zeitpunkt der Interpretation dieser Codezeile aktuell ist. Aus der Fehlermeldung geht hervor, dass die aktuelle Datentabelle zum Zeitpunkt der Interpretation dieser Codezeile keine Spalte mit dem Namen "Ausführungsdatum" enthält. Ich sehe, dass Sie zwei Tische öffnen; Stellen Sie immer sicher, dass die beabsichtigte Tabelle tatsächlich die aktuelle Tabelle ist, wenn Sie JMP überlassen, welche Tabelle verwendet werden soll. Mit dem Befehl Aktuelle Datentabelle können Sie jede Tabelle erzwingen, die die aktuelle Tabelle sein soll:
dt1 = open("firstfile");
dt2 = open("secondfile");
Current Data Table (dt1); // sets first table current
Current Data Table (dt2); //sets second table current
Sie müssen es jedoch nicht JMP überlassen, zu entscheiden. Sie können die zu verwendende Tabelle explizit angeben, ob aktuell oder nicht, indem Sie a verwenden Tabelle: Spalte Format wie in:
dt1:Run Date
2) Sobald Sie das Problem mit der Tabellenwährung behoben haben, müssen Sie das verwenden << Zeilen abrufen, in denen () Nachricht, die an die entsprechende Datentabelle gesendet wird, um Zeilen zurückzugeben, die einige Kriterien erfüllen. Oft werden diese wie in Ihrem Fall als Indizes verwendet. Angenommen, Sie möchten mit dt1 arbeiten, würde der Code dann wie folgt aussehen:
data_array[data] = dt1:Run Date[dt1 << Get rows Where(:ID == ID & :Timepoint == data)];
Diese Zeile erledigt 3 Jobs:
1) Ruft die Zeilen in dt1 ab, die einige Kriterien erfüllen, und gibt sie in einem Vektor zurück. Beachten Sie, dass, weil die << Zeilen abrufen, in denen () Nachricht wird an dt1 gesendet, es versteht sich, dass: ID und: Zeitpunkt auch in dt1 sind.
2) Verwendet den in Schritt 1 oben zurückgegebenen Vektor als Index für dt1: Ausführungsdatum, dh die Spalte Ausführungsdatum in dt1. Da wir das Ausführungsdatum mit dt1: Ausführungsdatum explizit auf die Tabelle dt1 festgelegt haben, spielt es keine Rolle, ob dt1 zufällig die aktuelle Tabelle ist oder nicht. Der Abschluss dieses zweiten Schritts gibt einen Vektor von Werten - genau die, die wir wollen - aus der Spalte Ausführungsdatum zurück.
3) Weist den Vektor der in Schritt 2 oben zurückgegebenen Ausführungsdatumwerte als Wert eines bestimmten Schlüssels zu. Daten, im assoziativen Array data_array .
Prost,
Brady
Betreff: Verschieben einer Teilmenge von Daten von einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungHallo Jim. Danke für die Antwort. Würde es Ihnen etwas ausmachen, in menschlichem Englisch zu erklären, wie Ihr Code funktioniert? Meine Interpretation lautet: Alle Zeilen, in denen die ID eindeutig ist, werden in den Zeilen platziert. Dann wird ein Index k instanziiert.Es wird innerhalb der Schleife erhöht, in der die Ausführungsdaten zum Datenarray hinzugefügt werden.In dieser Schleife wird jetzt anstelle des vorherigen Wertes jeder eindeutige Wert in theRows als Index für den Zugriff verwendet: Ausführungsdatum und dieses Ergebnis werden in das Datenarray eingetragen.
Das wäre für mich sinnvoll, wenn ich es nur länger studieren würde. Es ist auf den ersten Blick nicht zu klar. Nicht sicher. Aber Sie erklären am Ende Ihres Beitrags mit einer einzeiligen Schlussfolgerung.
Nachdem ich alle gesäuberten Variablen durch meine realen Variablen in meinem Code ersetzt habe, wird folgende Fehlermeldung angezeigt:
invalid subscript (must be number or list of numbers) in access or evaluation of 'theRows[k]' , theRows[/*###*/k]
und ich weiß nicht warum.
Ich bin immer noch verwirrt und werde dieses Stück Code weiter studieren. Es ist seltsam, dass ich im College eine ganze Reihe von Codierungskursen belegt habe, aber ich habe meine Wissensbasis nicht gepflegt, so dass sie im Laufe der Zeit möglicherweise erodiert sein könnte.
Danke für deine Hilfe!
Michael
PS: Warum assoziative Arrays: Ich dachte, es wäre eine effiziente Möglichkeit, Daten als JMP-Anfänger mit mehr Erfahrung im Sinne von Java / Python zu übertragen. Würden Sie empfehlen, die Tabellen direkt zu bearbeiten? Ich bin jedoch so weit auf diesem Weg, dass ich mich frage, ob es einfach interessant wäre, die anstehende Aufgabe auf diese Weise zu erledigen.
Betreff: Verschieben einer Teilmenge von Daten von einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungDanke, Brady. Das macht für mich alles Sinn.
Es sieht so aus, als ob einige dieser Dinge tatsächlich Probleme in meinem Code waren. Ich habe sie angesprochen und gehe weiter. Ich habe neue Probleme, die ich posten werde, sobald ich sie ein wenig herausgefunden habe.
Mike