Wertauswahl und Kopieren in neue SpaltenHey,
Ich versuche, ein (scheinbar ziemlich einfaches) zu automatisieren Wertauswahl, Spaltenerstellung und Kopieren/Einfügen Allerdings kann ich nicht die richtige Skriptkompilierung dafür finden.
1) Ich muss erstellen 3 neue Spalten Hinzufügen einer anderen Auswahl von Werten als einer gleiche Quellspalte zu jeder dieser 3 neuen Spalten und erstellen Sie eine Teilmenge jeder Auswahl wenn alle Spalten ausgefüllt sind .
2) Der Name der Teilmengen sollte dem Header der ursprünglichen Quelldatei plus einem neuen Anhang entsprechen.
Sei vorsichtig:
Die Position der Spalten und die Anzahl der Zeilen variieren in den Datendateien, die ich habe, die Namen sind jedoch alle gleich.
Ich habe diese beiden Skripte ausprobiert, die natürlich nicht korrekt sind, aber ich weiß nicht genau, was ich ändern muss, damit es funktioniert. Irgendwelche Vorschläge?
Version 1:
Names Default To Here( 1 );
dt = Current Data Table();
//Select values to copy into new column
vals 1 = Select Where (:p-value (two-sided test)2 <= 0,09); //it seems that the "2" in the column name is confusing, but unfortunately, it would take a long time to go through all tables and change the column name
// Put these in a new column 1
dt = NewColumn("sign_0,09", Numeric, Continuous, Values(vals1));
Wait( 5 );
//Column 2
vals 2 = Select Where (:p-value (two-sided test)2 <= 0,05);
dt<<GET selected="" rows="" dt="NewColumn("sign_0,05"," numeric=""></GET>
Version 2:
Names Default To Here( 1 );
dt = Current Data Table();
dt << :p-value (two-sided test)2 = [1,?]; //the end row varies and must be found automatically
results << New Column("sign_0,09", Numerical, Continuous);
For( i = 1, i <= NItems( "p-value (two-sided test)2"), i++,
results << Select Where (:p-value (two-sided test)2 <= 0,09) );
selRows = results << getSelectedRows;
AsColumn( results, "sign_0,09" )[selRows] = "p-value (two-sided test)2"[i];
//same process for 2 other new columns
dt<<SUBSET dt=""><< Select where :sign_0,09 != "";
dt<< Get selected rows
//the new name should be automatically given, too, is that possible?
dt << Subset( Output Table( "name as in original file plus _0,09 at the end" ), Selected Rows( 1 ), selected columns( 0 ) );
//same process for other 2 columns</SUBSET>
Ich würde mich sehr freuen, eine Lösung zu finden, da in den bisherigen Threads häufig ein Kopieren/Einfügen in neue Datentabellen erfolgt, jedoch „nie“ in eine neue Spalte, und es scheint meistens mit einer Zeichenfolgenauswahl zusammenzuhängen. Ich bin mir nicht sicher, ob die Auswahl auch für numerische Daten funktioniert.
Vielen Dank für jede Hilfe!
Betreff: Wertauswahl und Kopieren in neue SpaltenHey, hier ist die Vollversion ohne die Show-Funktionen, da diese in meinem Fall keinen Nutzen hatten.
Vielen Dank für Ihre Hilfe!
dt = Current Data Table(); // Assuming the data table is open
/* Step 1 - add 3 columns */
dt << New Column("sign_0,09",Numeric,Continuous)
<< New Column("sign_0,05",Numeric,Continuous)
<< New Column("sign_0,01",Numeric,Continuous);
// Getting the values of column of interest
ColVals = dt:Name("p-value (two-sided test) 2") << Get Values;
// Set up a dummy matrix
Dummy = J(NRows(dt),1,.);
// All Rows
AllRows = Index(1,NRows(dt),1);
/* Step 2 - Select from the column based on conditions */
/* This could also be replaced by loop */
SR1 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.09);
//do not change "." to "," as the programme uses "." for background calculation
Dummy[SR1,0] = ColVals[SR1];
dt:Name("sign_0,09") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR2 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.05);
Dummy[SR2,0] = ColVals[SR2];
dt:Name("sign_0,05") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR3 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.01);
Dummy[SR3,0] = ColVals[SR3];
dt:Name("sign_0,01") << Set Values(Dummy);
/* End of Step 2 */
/* Step 3 */
dt << Select Where (Name("p-value (two-sided test)2") <= 0.09);
dt << Subset( Output Table( "new_0,09" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.05);
dt << Subset( Output Table( "new_0,05" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.01);
dt << Subset( Output Table( "new_0,01" ), Selected Rows( 1 ), selected columns( 0 ) );
/* End of Step 3 */
Betreff: Wertauswahl und Kopieren in neue SpaltenHey, hier ist die Vollversion ohne die Show-Funktionen, da diese in meinem Fall keinen Nutzen hatten.
Vielen Dank für Ihre Hilfe!
dt = Current Data Table(); // Assuming the data table is open
/* Step 1 - add 3 columns */
dt << New Column("sign_0,09",Numeric,Continuous)
<< New Column("sign_0,05",Numeric,Continuous)
<< New Column("sign_0,01",Numeric,Continuous);
// Getting the values of column of interest
ColVals = dt:Name("p-value (two-sided test) 2") << Get Values;
// Set up a dummy matrix
Dummy = J(NRows(dt),1,.);
// All Rows
AllRows = Index(1,NRows(dt),1);
/* Step 2 - Select from the column based on conditions */
/* This could also be replaced by loop */
SR1 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.09);
//do not change "." to "," as the programme uses "." for background calculation
Dummy[SR1,0] = ColVals[SR1];
dt:Name("sign_0,09") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR2 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.05);
Dummy[SR2,0] = ColVals[SR2];
dt:Name("sign_0,05") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR3 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.01);
Dummy[SR3,0] = ColVals[SR3];
dt:Name("sign_0,01") << Set Values(Dummy);
/* End of Step 2 */
/* Step 3 */
dt << Select Where (Name("p-value (two-sided test)2") <= 0.09);
dt << Subset( Output Table( "new_0,09" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.05);
dt << Subset( Output Table( "new_0,05" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.01);
dt << Subset( Output Table( "new_0,01" ), Selected Rows( 1 ), selected columns( 0 ) );
/* End of Step 3 */
Betreff: Wertauswahl und Kopieren in neue Spalten@Jeff_Perkinson
Danke Jeff,
Ich hatte deinen Beitrag zu spät gelesen. Ich habe gerade den Teil zum Erstellen von Teilmengen zu der von Ihnen vorgeschlagenen Auswahl hinzugefügt und abgesehen von der automatischen Namenserstellung funktioniert er perfekt. Vielen Dank für den Vorschlag.
dt = Current Data Table();
dt << New Column( "sign_0,09",
Numeric,
"Nominal",
Format( "Best", 9 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.09,
:Name( "p-value (two-sided test) 2" )
)
)
);
dt << New Column( "sign_0,05",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.05,
:Name( "p-value (two-sided test) 2" )
)
)
);
dt << New Column( "sign_0,01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.01,
:Name( "p-value (two-sided test) 2" )
)
)
);
/* Step 3 */
// We already have the rows that meet the conditions
dt << Select Where (Name("p-value (two-sided test)2") <= 0.09);
dt << Subset( Output Table( "new_0,09" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.05);
dt << Subset( Output Table( "new_0,05" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.01);
dt << Subset( Output Table( "new_0,01" ), Selected Rows( 1 ), selected columns( 0 ) );
/* End of Step 3 */ Betreff: Wertauswahl und Kopieren in neue SpaltenBetreff: Wertauswahl und Kopieren in neue Spalten@uday_guntupalli
Ich habe das Skript mit meinen Daten (Ihrer Version und mit dem Austausch des Vorschlags von) ausgeführt @Mark_Bailey ) und es funktioniert, die Spalten zu erstellen und die ausgewählten Daten in die neue Spalte zu übertragen.
Der letzte Teil (siehe unten), der die ausgewählten Zeilen anzeigt, funktioniert jedoch nicht. Ich habe es mit „Wo auswählen und Teilmenge erstellen“ angepasst.
/* Step 3 */
// We already have the rows that meet the conditions
Show(SR1);
Show(SR2);
Show(SR3);
/* End of Step 3 */
/* Step 3 */
dt << Select Where (Name("p-value (two-sided test)2") <= 0.09);
dt << Subset( Output Table( "new_0,09" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.05);
dt << Subset( Output Table( "new_0,05" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.01);
dt << Subset( Output Table( "new_0,01" ), Selected Rows( 1 ), selected columns( 0 ) );
/* End of Step 3 */
Betreff: Wertauswahl und Kopieren in neue SpaltenVielen Dank für die Veröffentlichung einiger weiterer Details, das hilft einigen.Anstatt zu versuchen, die neuen Spalten zu erstellen und sie über JSL mit Werten zu füllen, würde ich einfach drei neue formelbasierte Spalten mit der Formel erstellen:
If( :Name( "p-value (two-sided test) 2" ) <= 0.09,
:Name( "p-value (two-sided test) 2" )
)

dt = Open( "seas_ratio_1_monthly.jmp" );
dt << New Column( "sign_0.09",
Numeric,
"Nominal",
Format( "Best", 9 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.09,
:Name( "p-value (two-sided test) 2" )
)
)
);
dt << New Column( "sign_0.05",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.05,
:Name( "p-value (two-sided test) 2" )
)
)
);
dt << New Column( "sign_0.01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.01,
:Name( "p-value (two-sided test) 2" )
)
)
);
Aber ich muss zugeben, dass ich immer noch nicht sicher bin, welchen Wert die Datentabellen haben, wenn nur die Zeilen berücksichtigt werden, die auf einer bestimmten Ebene von Bedeutung sind. Wie werden Sie diese Tabellen verwenden? Benötigen sie alle drei Signifikanzindikatorspalten (dh sign_0,09; sign_0,05; und sign_0,01)? Wenn nicht, können Sie vermeiden, alle Spalten zusammen zu erstellen, und nur die Zeilen unterteilen, die kleiner als jede Ebene sind. Können Sie uns mehr über Ihr ultimatives Ziel erzählen und warum Sie Datentabellen wie die von Ihnen beschriebenen wünschen? Möglicherweise können wir noch einfachere Methoden anbieten.
Betreff: Wertauswahl und Kopieren in neue SpaltenIch sehe diesen Ansatz, aber es gibt einen einfacheren Weg, bei dem der ausgewählte Zeilenstatus geändert wird. An Stelle von:
SR1 = dt << Select Where(:Name("p-value (two-sided test) 2") <= 0.09) << Get Selected Rows; <BR />// You can edit this to conform to european convention of 0,09
dt << Clear Select;
Sie können einfach Folgendes verwenden:
SR1 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.09)
// You can edit this to conform to european convention of 0,09
Auf diese Weise stören Sie die aktuelle Zeilenauswahl nicht.
Betreff: Wertauswahl und Kopieren in neue SpaltenDas sieht gut aus. Ich werde es so schnell wie möglich testen.
Wenn Sie in den drei neuen Spalten auf gemeinsame Elemente verweisen, gilt dies nur für die ausgewählten Werte, die zu den einzelnen Spalten hinzugefügt werden!
Beispielsweise erscheint die Auswahl von Werten <= 0,01 auch in den Spalten 0,05 und 0,09 und Werte <= 0,05 auch in den Spalten 0,09.
Vereinfacht:
A = [ 0,01 , 0,05 ,0,09]
B = [ 0,01 , 0,05 ]
C = [ 0,01 ]
Es wird jedoch KEIN anderes Muster oder eine Art „Jede zweite Reihe ist in allen drei Reihen gleich“-Struktur geben.
Ja, vielleicht gibt es eine Möglichkeit, mit Matrizen zu arbeiten und den gesamten Prozess reibungsloser zu gestalten.
A <SPAN class="token operator">=</SPAN> <SPAN class="token punctuation">[</SPAN><SPAN class="token number">1</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">2</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">3</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">4</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">5</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">6</SPAN><SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">;</SPAN>
B <SPAN class="token operator">=</SPAN> <SPAN class="token punctuation">[</SPAN><SPAN class="token number">1</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">2</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">3</SPAN><SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">;</SPAN>
C <SPAN class="token operator">=</SPAN> <SPAN class="token punctuation">[</SPAN><SPAN class="token number">3</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">5</SPAN><SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">;</SPAN>
Betreff: Wertauswahl und Kopieren in neue Spalten@Pacco ,
Ok, damit sollten Sie 90 % des Ziels erreicht haben.
dt = Current Data Table(); // Assuming the data table is open
/* Step 1 - add 3 columns */
dt << New Column("sign_0,09",Numeric,Continuous)
<< New Column("sign_0,05",Numeric,Continuous)
<< New Column("sign_0,01",Numeric,Continuous);
// Getting the values of column of interest
ColVals = dt:Name("p-value (two-sided test) 2") << Get Values;
// Set up a dummy matrix
Dummy = J(NRows(dt),1,.);
// All Rows
AllRows = Index(1,NRows(dt),1);
/* Step 2 - Select from the column based on conditions */
/* This could also be replaced by loop */
SR1 = dt << Select Where(:Name("p-value (two-sided test) 2") <= 0.09) << Get Selected Rows; // You can edit this to conform to european convention of 0,09
dt << Clear Select;
Dummy[SR1,0] = ColVals[SR1];
dt:Name("sign_0,09") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR2 = dt << Select Where(:Name("p-value (two-sided test) 2") <= 0.05) << Get Selected Rows; // You can edit this to conform to european convention of 0,05
dt << Clear Select;
Dummy[SR2,0] = ColVals[SR2];
dt:Name("sign_0,05") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR3 = dt << Select Where(:Name("p-value (two-sided test) 2") <= 0.01) << Get Selected Rows; // You can edit this to conform to european convention of 0,01
dt << Clear Select;
Dummy[SR3,0] = ColVals[SR3];
dt:Name("sign_0,01") << Set Values(Dummy);
/* End of Step 2 */
/* Step 3 */
// We already have the rows that meet the conditions
Show(SR1);
Show(SR2);
Show(SR3);
/* End of Step 3 */ <BR />@Jeff_Perkinson ,
Gibt es eine einfache Möglichkeit, gemeinsame Elemente zwischen Matrizen zu finden? Vielleicht könnte Design() helfen, aber können Sie ein Beispiel geben?
A = [1,2,3,4,5,6];
B = [1,2,3];
C = [3,5];
// The common element would be 3
Ich weiß, dass ich assoziative Arrays und die Intersect-Funktionalität verwenden könnte, aber Matrizen sollten keine einfache Möglichkeit bieten, häufige/ungewöhnliche Elemente zu bestimmen.
Betreff: Wertauswahl und Kopieren in neue SpaltenHallo Jeff,
Vielen Dank auch für deinen Blick.
Ich habe die Dateien in meiner Antwort oben angehängt! Ich hoffe, sie klären meine Frage.
Betreff: Wertauswahl und Kopieren in neue SpaltenBetreff: Wertauswahl und Kopieren in neue SpaltenHey,
Vielen Dank für den Beitrag. Das ist schon sehr hilfreich zu wissen.
Es tut mir leid, dass ich das Skript falsch kopiert habe. Ich werde es mir für das nächste Mal merken.
Um klarer zu machen, was ich versuche, füge ich eine schrittweise Übersicht bei, wie das Ergebnis aussehen soll. Ich hoffe, dass der Leitfaden mehr Klarheit schafft.
Ich hänge auch das Beispiel im JMP-Format an.
Danke für die Hilfe!
Betreff: Wertauswahl und Kopieren in neue SpaltenIch habe Ihre Beschreibung dessen, was Sie tun möchten, gelesen, aber es fällt mir schwer, sie ohne ein konkretes Beispiel zu verstehen. Da Ihr JSL außerdem nicht das tut, was Sie von ihm erwarten, ist es schwierig, daraus zu erraten, wie es Ihnen helfen kann.
Könnten Sie ein paar weitere Details darüber posten, was genau Sie vorhaben, vorzugsweise mit Screenshots der betreffenden Datentabellen und dem, was Sie am Ende erhalten möchten? Ich denke, das würde uns in der Community helfen, Ihnen direkter zu helfen.
Danke.
Betreff: Wertauswahl und Kopieren in neue Spalten@Pacco ,
Mal sehen, wie ich versuchen kann, zu helfen. Das Wichtigste zuerst: Eine Bitte von meiner Seite lautet: Wenn Sie Code einfügen, fügen Sie ihn bitte mit dem Codeblock „JSL“ ein, damit die Community-Mitglieder Ihren Code leicht lesen können. Nachdem wir uns darum gekümmert haben, schauen wir uns Ihren Code an:
1. vals 1 = Select Where (:p-value (zweiseitiger Test)2 <= 0,09); / /Es scheint, dass die „2“ im Spaltennamen verwirrend ist, aber leider würde es lange dauern, alle Tabellen durchzugehen und den Spaltennamen zu ändern
- Wenn Sie einen komplizierten Namen wie diesen für eine Spalte haben und ihn nicht ändern möchten, wäre es ratsam, name() zu verwenden. Daher sollte die obige Zeile wie folgt umgeschrieben werden:
vals1 = Select Where (Name("p-value (two-sided test)2 ")<= 0,09); // I don't know if you are using European convention for the comma instead of decimal2. Eine Select-Where-Anweisung ist nun eine Nachricht, die an eine Datentabelle ausgegeben wird. Daher sollte die obige Codezeile weiter verfeinert werden als:
vals1 = dt << Select Where (Name("p-value (two-sided test)2") <= 0,09); Wenn Sie so freundlich wären, diese Vorschläge auszuprobieren und vielleicht einen Beispieldatensatz bereitzustellen, kann ich versuchen, auch die anderen Probleme zu beheben.