Verschieben einer Teilmenge von Daten aus einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungEs tut mir leid, dass ich das schon wieder poste. Ich habe hier Teile meines Workflows maskiert gepostet, um Hilfe zu erhalten, und ich tue mich immer noch schwer. Ich habe Schwierigkeiten, Antworten zu überprüfen, da ich auf StackOverflow schlechte Erfahrungen gemacht habe, als ich ohne wirklichen Grund angeschrien wurde und so. Ich bin sicher, die Narben werden mit der Zeit heilen. Wie auch immer, ich bin da und werde mich irgendwann um Ihre Antworten kümmern.
Um zum technischen Punkt zu kommen:
Ich versuche, die Daten, an denen einige Proben ausgeführt wurden (jede Probe hätte bei drei verschiedenen Gelegenheiten ausgeführt werden müssen, vorausgesetzt, dass während des Laborteils des Projekts, bei dem ich nicht anwesend war, alles gut lief), in drei separate Spalten einer Manifestdatei zu kopieren, die, soweit ich es herausgefunden habe, die laufenden Metadaten für unser Projekt aufzeichnet, sodass jede Spalte eine Instanz der Datenerfassung darstellt. Es gibt mehrere Spender, jeweils mit einer Spender-ID, und einige Redundanzen in den Daten, wie mehrere Erfassungskanäle auf dem Instrument für den „gleichen Datenpunkt“ (hängt davon ab, wie man es betrachtet), aber ich denke, das sollte es sein.
Hier ist mein Pseudocode, mit dem ich zu arbeiten versucht habe, und bisher war es ziemlich holprig. Ich weiß nicht, warum. Ich bin kein erfahrener Informatiker, Entwickler oder Software-Ingenieur. Jede Hilfe ist willkommen.
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 identifier
Datenzusammenführung und -bereinigungBetreff: Verschieben einer Teilmenge von Daten aus einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungJetzt versuche ich, die Daten/Daten der Manifestdatei in den Zeilen mit den richtigen IDs zuzuweisen:
... );
//write(LBCM_array);
dt_manifest << Get Rows Where(dt_manifest:ID Number for Updating Table == ID)[:Actual Data 1 Date] = data_array["data1"];
//repeat for data 2 & 3
);
was wirklich, ich habe immer noch keine Ahnung, wie ich als Anfänger mit JSL umgehen soll, also bekomme ich den Fehler
["data1" => {}, "data2" => {}, "data3" => {}]
attempting to assign to an object that is not an L-value in access or evaluation of 'Assign' , dt_manifest << Get Rows Where(
dt_manifest:ID Number for Updating Table == ID
)[:Actual Data 1 Date] = /*###*/data_array["data1"] /*###*/Ich habe keine Ahnung, was das bedeutet.
Danke,
Mike
Betreff: Verschieben einer Teilmenge von Daten aus einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungFolgendes funktioniert bei mir...
Names Default To Here( 1 );
dt_data = Open("...");
Summarize( dt_data, IDs = by(dt_data:ID)); //this finds all the unique donor IDs in the data file, which we will need
//First, populate the temporary data structure--associative array--from the data file which we will then copy over to the manifest data file.
For(i = 1, i <= N Items(IDs), i++,
ID = num(IDs[i]); //the type conversion here is important, or else a key-value call in the associative array below doesn't work
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
data_array[data] = dt_data:Run date[dt_data << Get rows Where(:ID == ID & :Timepoint == data)]
);
);außer dass ich jetzt mehrere Kopien jedes Dateneintrags (Datumszeitpunkt) im data_array habe. Ich frage mich, wie man das sauber schrubbt, nur eine Kopie von jedem Datum/Datum in data_array macht?
Ich habe eine if-Anweisung ausprobiert und eine As Date()-Anweisung verwendet, um die Daten für den Vergleich und die Eingabe zu vergleichen und zu formatieren, um sicherzustellen, dass wir nur einen eindeutigen Wert erhalten. Aber das hat mir bisher Probleme bereitet (dh das Array wird entweder fehlerhaft oder wieder leer).
Mit der bisherigen Entwicklung bin ich aber sehr zufrieden.
@txnelson : Entschuldigung, ich mag Ihre Methode und danke Ihnen für Ihre Hilfe, aber Sie werden feststellen, dass ich es ohne Ihre Indizierungs-"k"-Technik finden konnte
. (Ich frage mich, wie Ihre Methode fair ist, wenn es mehrere Daten mit demselben Wert gibt, was ich in meinem Fall habe?)
@brady_brady : Beachten Sie, dass ich Datentabellenkennungen vor den Spaltenaufrufen implementiert habe, wo dies angemessen ist. Danke, dass Sie mir dieses grundlegende Konzept beigebracht haben; Ich war vor Neugierde gestorben und habe bis jetzt ohne Ergebnis gegoogelt.
Mike
Betreff: Verschieben einer Teilmenge von Daten aus einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungHallo zusammen. Ich mache tatsächlich einmal Fortschritte, anstatt an etwas festzuhalten, ohne zu wissen, in welche Richtung es gehen soll.
Im Moment passt eines meiner Schlüssel/Wert-Paare nicht, daher erhalte ich bei einem meiner Array-Aufrufe falsche Ergebnisse. Ich versuche, dies zu debuggen, damit ich die Datentabelle korrekt auf das, was ich für die Übertragung an das assoziative Array möchte, unterteilen/filtern kann.
Vielen Dank für Ihre Hilfe.
MikeBetreff: Verschieben einer Teilmenge von Daten aus einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungDanke, Brady. Das ergibt für mich alles Sinn.
Es sieht so aus, als wären einige dieser Dinge tatsächlich Probleme in meinem Code. Ich habe sie angesprochen und gehe weiter. Ich habe neue Probleme, die ich veröffentlichen werde, sobald ich sie ein wenig herausgefunden habe.
Mike
Betreff: Verschieben einer Teilmenge von Daten aus 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 ist: Alle Zeilen, in denen die ID eindeutig ist, werden in theRows platziert. Dann wird ein Index k instanziiert.Es wird innerhalb der Schleife inkrementiert, in der die Ausführungsdaten zum Datenarray hinzugefügt werden.Innerhalb dieser Schleife wird jetzt anstelle von dem, was ich zuvor hatte, jeder eindeutige Wert in theRows als Index für den Zugriff auf :Run date verwendet, und dieses Ergebnis wird in das Datenarray gefüllt.
Das würde für mich Sinn machen, wenn ich es nur länger studieren würde. Das ist auf den ersten Blick nicht so klar. Nicht sicher. Aber Sie erklären am Ende Ihres Beitrags mit einer einzeiligen Schlussfolgerung.
Nachdem ich alle bereinigten Variablen in meinem Code durch meine echten Variablen ersetzt habe, erhalte ich den Fehler:
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, ich habe an der Universität eine ganze Reihe von Programmierkursen belegt, aber ich habe meine Wissensbasis nicht gepflegt, also nehme ich an, dass sie im Laufe der Zeit 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 Erfahrung in Richtung Java/Python zu übertragen. Würden Sie empfehlen, die Tabellen direkt zu manipulieren? Ich bin jedoch so weit auf diesem Weg, dass ich mich frage, ob es wirklich interessant wäre, die anstehende Aufgabe auf diese Weise zu erledigen.
Betreff: Verschieben einer Teilmenge von Daten aus einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungHi,
Du schreibst:
Mein Problem ist im Moment mit dieser Zeile:
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
Ich sehe ein paar potenzielle Probleme ... sehen Sie sich diese unbedingt an:
1) :Run Date, wie geschrieben, bezieht sich auf eine Spalte in der Datentabelle, die zum Zeitpunkt der Interpretation dieser Codezeile aktuell ist. Aus der Fehlermeldung geht hervor, dass zum Zeitpunkt der Interpretation dieser Codezeile die aktuelle Datentabelle keine Spalte namens "Run Date" 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 es JMP überlassen, welche Tabelle verwendet werden soll. Sie können jede Tabelle, die Sie möchten, zur aktuellen Tabelle machen, indem Sie den Befehl Current Data Table verwenden:
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 die Entscheidung jedoch nicht JMP überlassen. Sie können die zu verwendende Tabelle, aktuell oder nicht, explizit mit a angeben Tabelle:Spalte Format, wie in:
dt1:Run Date
2) Sobald Sie das Problem mit der Tischwährung behoben haben, müssen Sie die 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 als Indizes verwendet, wie in Ihrem Fall. 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 Linie erledigt 3 Aufgaben:
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 wo() Nachricht an dt1 gesendet wird, versteht es sich, dass :ID und :Timepoint auch in dt1 enthalten sind.
2) Verwendet den in Schritt 1 oben zurückgegebenen Vektor als Indizes für dt1:Run Date, das die Run Date-Spalte in dt1 ist. Da wir Run Date mit dt1:Run Date explizit auf die Tabelle dt1 begrenzt haben, spielt es keine Rolle, ob dt1 die aktuelle Tabelle ist oder nicht. Der Abschluss dieses zweiten Schritts gibt einen Vektor von Werten zurück – genau die, die wir wollen – aus der Spalte „Ausführungsdatum“.
3) Weist den in Schritt 2 oben zurückgegebenen Vektor der Ausführungsdatumswerte als Wert eines bestimmten Schlüssels zu. Daten, im assoziativen Array, Datenarray .
Prost,
Brady
Betreff: Verschieben einer Teilmenge von Daten aus einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungMike,
Ich bleibe ein wenig verwirrt darüber, warum Sie ein assoziatives Array verwenden möchten, aber ich glaube trotzdem, dass der folgende Code in das Array verschoben wird, die Datumswerte für die 3 Messzeilen für jede ID.Ich habe einige Daten erstellt, von denen ich hoffe, dass sie dem Layout Ihrer Daten ähneln.Ich vermute nur basierend auf Ihren Aussagen und Ihrer Codeverwendung.

Hier ist das Skript.Die obige Datentabelle wird am Anfang des Skripts generiert, sodass der Kern Ihres Codes mit meinen Änderungen unter der Datentabellengenerierung 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 aus einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungHallo allerseits. Hier mein bisheriger Code:
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 bereinigt, damit es vertraulich ist (keine Sorge, Unternehmensinformationen auszuspionieren
), während Struktur und Informationen erhalten bleiben (Name 'ein' Name, Label zu Label).
Mein Problem ist im Moment mit dieser Zeile:
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
Es wirft die Fehlermeldung
.
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>
:Run date ist eine Datenspalte (Kopfzeile) 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 gesammelt werden sollte und deshalb data_array drei Schlüssel und drei leere Werte hat, wenn es initialisiert wird. 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 scheint es, als hätte ich Probleme beim Zugriff auf die 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 irgendjemand aus dem Publikum mitmachen und eine Lösung oder einen Beitrag dazu anbieten kann, wie man auf syntaktisch (und möglicherweise semantisch) korrektere Weise spezifiziert, wie die Teilmenge von Daten, die ich bin, ausgewählt wird? Interesse an (aus data_dt)?
Machen Sie sich keine Sorgen über das Transpositionsproblem. Ich werde mich später damit befassen, und ich denke ehrlich gesagt, dass es ziemlich einfach sein sollte, sobald sich die Daten in einem aa (assoziatives Array) befinden. An diesem Punkt lerne ich noch, wie man Zeilen- / Spaltenauswahlen, Teilmengen von Datentabellen usw. bearbeitet.
Noch eine Anmerkung: Wenn es seltsam erscheint, dass Daten und Daten und Arrays verwechselt werden, liegt das höchstwahrscheinlich daran, dass ich schlechte Namen für die Scrubbing-/Anonymisierungstitel/Beschriftungen der Datenspalten oder relevanten Datenentitäten gewählt habe, um die Geheimnisse meines Unternehmens zu schützen. Ich bin immer noch ein Anfänger in diesem ganzen Prozess, würde ich sagen, und ich ziehe es vor, auf der sicheren Seite zu irren.
Ich werde von meiner Seite aus weiter an dem Problem arbeiten.
Danke vielmals,
Mike
Betreff: Verschieben einer Teilmenge von Daten aus einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungDanke, Brady.Betreff: Verschieben einer Teilmenge von Daten aus einer Tabelle in die Spalten einer zweiten Tabelle mit einer TransponierungHi,
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 gesuchten Informationen zu erhalten.
Spezifische, eher allgemeine Fragen zu stellen, ist der richtige Weg, wenn man es durchziehen kann – obwohl mir klar ist, dass man manchmal „nicht weiß, was er nicht weiß“. Das Posten eines beträchtlichen Stücks Pseudocode kann die Leute abschrecken ... wenn Sie Ihre Frage nicht anders stellen können, wird es sehr hilfreich sein, eine "Vorher"- und "Nachher"-Datei - und Screenshots - anzuhängen, damit die Zuschauer konkret werden Beispiele einer "Start"-Tabelle (oder Textdaten) und einer "Ziel"-Tabelle. Dies würde in diesem speziellen Fall definitiv einen echten Unterschied machen. Wenn Sie die Datensätze "sanieren" müssen, ist das in Ordnung (am besten, wirklich). Solange der Punkt, den Sie zu veranschaulichen versuchen, noch gemacht werden kann, ist alles gut.
Wenn Sie spezifische, gezielte Fragen stellen und anschauliche Dateien und Screenshots beifügen, stehen die Chancen gut, dass viele hier einspringen, um zu helfen. Mir fallen auf Anhieb mehr als ein paar ein, die da nicht wirklich widerstehen können!
Prost,
Brady