ottenere il nome della colonna con valori di cut-off specificiCIAO,
Cerco di contare e ottenere nomi di colonne specifici da questi esempi di dati (i miei dati reali contenevano 180 colonne e 20000 righe)
Voglio selezionare la colonna con il limite > 1000
| NO. | La*1:01 | La*2:01 | Si*9:02 | Le 10:01 sono | DR*56:01 | DP*07_G | Ottieni il nome |
| 1 | 10.67 | 0 | 9520.23 | 15000.1 | 90.56 | 40,89 | Si*9:02, Si*10:01 |
| 2 | 0 | 0 | 0 | 0 | 0 | 9.56 | |
| 3 | 9040.3 | 345.3 | 345,9 | 999,9 | 345 | 10.5 | La*1:01 |
| 4 | 34.4 | 4566 | 45 | 7 | 0 | 0 | La*2:01 |
| 5 | 9190.2 | 13567 | 3456 | 6789 | 9088 | 0 | A*1:01,A*2:01,B*9:02,C*10:01,DR*56:01 |
| 6 | 0 | 0 | 0 | 0 | 0 | 0 | |
| ... | | | | | | | |
Provo lo script precedente in questo modo
Names Default To Here( 1 );
// Create a sample data table
dt = New Table( "Example",
Add Rows( 2 ),
New Column( "A*1:01", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
New Column( "A*2:01", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
New Column( "B*9:02", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
New Column( "C*10:01", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
New Column( "DR*56:01", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
//get wanted columns. Assumes that IMC columns start from column 1 and all IMC columns are one after another
colNames = dt << Get Column Names("String");
For(i = N Items(colNames), i > 3000 , i--,
);
//new column with IMC with value 1
dt << New Column( "Ag", Character,
<< Set Each Value(
rowValues = dt[Row(), 0][1::N Items(colNames)]; //get values of row as matrix
colIndex = Contains(rowValues, 1); //get index of
If(colIndex > 0, //handle
colNames[colIndex], //get column name with the index
""; //when no 1 found use ""
);
);
);Potresti per favore correggere i miei script? Grazie!
Inoltre, posso usare la matrice perché ho bisogno di generare la "nuova colonna" di 180 colonne.
Migliore,
Fusione e pulizia dei datiRe: ottenere il nome della colonna con valori di cut-off specificiGrazie, Jarmo. È lavoro!
Re: ottenere il nome della colonna con valori di cut-off specificiNon è compatibile con la biologia.
Re: ottenere il nome della colonna con valori di cut-off specificiEcco una specie di script, devo ancora fare delle congetture sulle regole corrette, quindi non ho idea se fa quello che dovrebbe fare
Names Default To Here(1);
dt = Open("$DOWNLOADS/Examples_get column name_edit.jmp");
// fix data
For Each({colname}, dt << Get Column Names("Character", "String"),
If(colname == "Alphabet",
break();
);
Column(dt, colname) << Set Data Type("Numeric") << Set Modeling Type("Continuous");
);
dt << Delete Columns("get name and value");
dt << New Column("R", Numeric, Ordinal, Formula(Row()));
dt_stacked = dt << Stack(
columns(
:"DOA1*01:01,DOB1*01:01_DO1"n, :"DOA1*02:01,DOB1*01:01_DO1"n,
:"DOA1*03:01,DOB1*01:01_DO1"n, :"DOA1*02:01,DOB1*02:01_DO2"n,
:"DOA1*01:05,DOB1*02:01_DO2"n, :"DOA1*04:03,DOB1*03:01_DO3"n,
:"DOA1*06:01,DOB1*04:01_DO4"n, :"DOA1*05:01,DOB1*03:01_DO7"n
),
Source Label Column("Label"),
Stacked Data Column("Data"),
Output Table("stacked")
);
rows_to_delete = dt_stacked << Get Rows Where(:Data <= 1000);
dt_stacked << Delete Rows(rows_to_delete);
dt_stacked << New Column("Match", Numeric, Nominal);
For Each Row(dt_stacked,
alphs = Words(:Alphabet, ",");
temp_label = Regex(:Label, "(\d\*)", "", GLOBALREPLACE);
retval = 0;
For Each({alph}, alphs,
If(Contains(temp_label, alph),
retval = 1;
break();
);
);
:Match = retval;
);
rows_to_delete = dt_stacked << Get Rows Where(:Match == 0);
dt_stacked << Delete Rows(rows_to_delete);
dt_stacked << New Column("NewStr", Character, Nominal, Formula(
:Label || " (" || Char(:Data) || ")"
));
Summarize(dt_stacked, rs = By(:R));
fixed_rs = Transform Each({r}, rs, Num(r));
vals = Associative Array();
For Each({r}, fixed_rs,
t = dt_stacked << Get Rows Where(:R == r);
vals[r] = Concat Items(dt_stacked[t, "NewStr"], ",");
);
Close(dt_ stacked);
new_col = dt << New Column("Res", Character, Nominal, Formula(
If(Contains(vals, :R),
vals[:R]
,
""
);
));
dt << run formulas;
new_col << Delete Formula;
</CODE></P>
<P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-781655" slang="en-US" mode="CREATE">Re: ottenere il nome della colonna con valori di cut-off specifici</LINGO-SUB><LINGO-BODY id="lingo-body-781655" slang="en-US" mode="CREATE"><P>Perché DOA1*0x non corrisponde a DOx?</P></LINGO-BODY><LINGO-SUB id="lingo-sub-781574" slang="en-US" mode="CREATE">Re: ottenere il nome della colonna con valori di cut-off specifici</LINGO-SUB><LINGO-BODY id="lingo-body-781574" slang="en-US" mode="CREATE"><P>Grazie Jarmo, vorrei allegare il file compatibile con quello che voglio fare qui. Voglio abbinare la colonna Alphabet composta da DOA e DO con ogni colonna di DOA1*0x:0x,DOB1*0x:0x_DOx. DOA0x corrisponde a DOA1*0x (non includere dopo ":") e DOx o DOB1*Ox corrisponde a DOx. Tutti devono avere un valore superiore a 1000 per essere mostrati nella colonna dei risultati. Non posso correggere la formula esistente come hai detto. Grazie in anticipo!</P></LINGO-BODY><LINGO-SUB id="lingo-sub-781510" slang="en-US" mode="CREATE">Re: ottenere il nome della colonna con valori di cut-off specifici</LINGO-SUB><LINGO-BODY id="lingo-body-781510" slang="en-US" mode="CREATE"><P>Il mio script ha gestito le situazioni che hai fornito. A seconda della domanda reale, lo script potrebbe richiedere una riscrittura totale o forse solo alcune piccole modifiche.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-781509" slang="en-US" mode="CREATE">Re: ottenere il nome della colonna con valori di cut-off specifici</LINGO-SUB><LINGO-BODY id="lingo-body-781509" slang="en-US" mode="CREATE"><P>Inoltre, se una colonna nell'alfabeto di interesse aveva più di 1, lo script non veniva eseguito. Hai qualche suggerimento in merito?</P><P> </P><P>Grazie!</P></LINGO-BODY><LINGO-SUB id="lingo-sub-781508" slang="en-US" mode="CREATE">Re: ottenere il nome della colonna con valori di cut-off specifici</LINGO-SUB><LINGO-BODY id="lingo-body-781508" slang="en-US" mode="CREATE"><P>Osservando la tabella, l'inizio e la fine saranno diversi (inizio A*1 e fine A1), quindi sarà necessario aggiungere queste chiavi "extra" all'array associativo per eseguire il confronto E gestire i duplicati in seguito.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-781507" slang="en-US" mode="CREATE">Re: ottenere il nome della colonna con valori di cut-off specifici</LINGO-SUB><LINGO-BODY id="lingo-body-781507" slang="en-US" mode="CREATE"><P>Grazie per il suggerimento. Se voglio abbinare la prima parola prima di ":" dovrebbe essere questa</P><PRE><CODE class=" language-jsl">alph = Word(1, colname, ":");
e se voglio abbinare l'ultima parola dopo "_" dovrebbe essere questa
alph = Word(-1, colname, "_");
E se dovessi abbinare prima di ":" e dopo "_" simultaneamente? Dopo aver unito gli script che ho eseguito per ciascuno di quelli sopra, non sono riuscito a gestire i duplicati (esattamente la stessa cosa).
Grazie
Re: ottenere il nome della colonna con valori di cut-off specificiCome vengono determinati quegli "alfabeti"? Sono tutto ciò che sta dopo l'ultimo "_"? Se è così, dovresti essere in grado di apportare una modifica molto leggera al mio script e prendere l'ultima parola invece della prima e usare un separatore diverso, quindi questa parte richiede una leggera modifica
alph = Word(1, colname, "*");
Re: ottenere il nome della colonna con valori di cut-off specificiGrazie mille. Questo script funziona. Tuttavia, mi dispiace che i miei dati originali fossero più complicati di così. L'alfabeto di interesse ha più "alfabeto" e "numeri" separati da "," (A1, B9) come file allegati. Come posso ottenere nome e valore della colonna che correla la colonna alfabeto di interesse e il nome della colonna.

Grazie per l'aiuto.
Re: ottenere il nome della colonna con valori di cut-off specificiSe lo script è stato scritto per essere eseguito con una colonna denominata "No" seguita da colonne numeriche. La tabella dati fornita ha 2 colonne di caratteri oltre a quella numerica. Se rimuovi le colonne "Alphabet of interest" e "get name and value" e poi esegui lo script, funziona correttamente.
Dovresti riuscire a modificare facilmente lo script per compensare le colonne aggiuntive. Eliminandole nello script prima di iniziare a recuperare i nomi delle colonne, oppure eliminandole dall'elenco dei nomi delle colonne prima di elaborare For Each, dovrebbe funzionare.
Re: ottenere il nome della colonna con valori di cut-off specificiMolto probabilmente fare qualcosa come ha suggerito Jim è più veloce e più facile, ma puoi fare qualcosa del genere con il metodo che ho dimostrato
Names Default To Here(1);
dt = Open("$DOWNLOADS/Examples_get column name_by cutoff.jmp", invisible);
Summarize(dt, alphs = By(:"Alphabet of interest"n));
aa = Associative Array(alphs, Repeat({{}}, N Items(alphs)));
collist = dt << Get Column Names("String");
For Each({colname}, collist,
alph = Word(1, colname, "*");
If(Contains(aa, alph),
Insert Into(aa[alph], colname);
Column(dt, colname) << Set Data Type("Numeric") << Modeling Type("Continuous");
);
);
str_template = "^col^ (^val^)";
newcol = dt << New Column("getname", Character, Nominal, Formula(
cols = aa[:"Alphabet of interest"n];
vals = dt[Row(), aa[:"Alphabet of interest"n]];
valid_idx = Loc(vals > 1000);
If(N Items(valid_idx) > 0,
res = {};
For Each({{col, val}}, Across(cols[valid_idx], vals[valid_idx]),
Insert Into(res, Eval Insert(str_template));
);
Concat Items(res, ", ");
,
""
);
));
dt << run formulas;
newcol << delete formula;
dt << show window(1);

Re: ottenere il nome della colonna con valori di cut-off specificiGrazie, Jim, ma non funziona. Per favore, guarda il file allegato.
Re: ottenere il nome della colonna con valori di cut-off specifici
Grazie mille, vorrei chiarire questo. Ho un'altra colonna di interesse come "alfabeto di interesse" e voglio ottenere nome e valore di tutte le colonne con valori > 1.000 e tutte le colonne corrispondono all'alfabeto di colonna di interesse.
Grazie!
Re: ottenere il nome della colonna con valori di cut-off specificiEcco un metodo alternativo che può aiutare con un gran numero di colonne
Names Default To Here( 1 );
dt = Open("$DOWNLOADS/Examples_get column name_by cutoff.jmp");
colnames = Remove( dt << Get Column Names( "String" ), 1 ); // drop No column
// Fix data and modeling types
For Each({colname}, colnames,
Column(dt, colname) << Data Type("Numeric") << Modeling Type("Continuous");
);
dtStack = dt << Stack(
columns( colnames ),
Source Label Column( "ColName" ),
Stacked Data Column( "Value" ),
Output Table( "The Stack" )
);
dtStack << select where( :value <= 1000 );
dtStack << delete rows;
dtStack << delete columns( Value );
dtSplit = dtStack << Split(
Split By( :ColName ),
Split( :ColName ),
Group( :No ),
Output Table( "Split of The Stack by ColName" ),
Sort by Column Property
);
close( dtStack, nosave );
colnames = Remove( dtSplit << Get Column Names( "String" ), 1 );
dtSplit << Combine Columns(
delimiter( "," ),
columns( colnames ),
Column Name( "Get Name" )
);
dtSplit << delete columns( colnames );
dt << Update( With( dtSplit ), Match Columns( :No = :No ) );
Close( dtSplit, nosave );Re: ottenere il nome della colonna con valori di cut-off specificiCome desideri estrarli? La mia soluzione non crea una nuova colonna con i nomi delle colonne come stringhe separate da , e spazio?

Desideri controllare i valori per colonna anziché per riga? O qualcos'altro?
Modificare:
Se vuoi solo un elenco di colonne diverso, dovrei sapere come filtrarlo. Se vuoi solo tutte le colonne, rimuovi la funzione Remove()
Names Default To Here(1);
dt = Open("$DOWNLOADS/Examples_get column name_by cutoff.jmp", invisible);
colnames = dt << Get Column Names("String");
For Each({colname}, colnames,
Column(dt, colname) << Data Type("Numeric") << Modeling Type("Continuous");
);
For(i = 1, i < 100, i++,
newcol = dt << New Column(Hex(i), Numeric, Nominal, Values(J(1, N Rows(dt), Random Normal()*1000)));
);
colnames = dt << Get Column Names("String");
newcol = dt << New Column("getname", Character, Nominal, Formula(
valid_idx = Loc(dt[Row(), colnames] > 1000);
If(N Items(valid_idx) > 0,
Concat Items(colnames[valid_idx], ", ")
,
""
);
));
dt << run formulas;
newcol << delete formula;Re: ottenere il nome della colonna con valori di cut-off specificiCiao Jarmo, hai qualche idea per estrarre i valori di questo che sono più del limite (se ho 50 colonne) con ogni nome di colonna (getname column su un examples)
Re: ottenere il nome della colonna con valori di cut-off specificiDovrai aprire la tua tabella, correggere le colonne e quindi eseguire la parte in cui viene creata la nuova colonna
Names Default To Here(1);
dt = Open("$DOWNLOADS/Examples_get column name_by cutoff.jmp", invisible);
colnames = Remove(dt << Get Column Names("String"), 1); // drop No column
// Fix data and modeling types
For Each({colname}, colnames,
Column(dt, colname) << Data Type("Numeric") << Modeling Type("Continuous");
);
newcol = dt << New Column("getname", Character, Nominal, Formula(
valid_idx = Loc(dt[Row(), colnames] > 1000);
If(N Items(valid_idx) > 0,
Concat Items(colnames[valid_idx], ", ")
,
""
);
));
dt << run formulas;
newcol << delete formula;
Ti consiglio vivamente di consultare la Guida allo scripting di JMP Help
Re: ottenere il nome della colonna con valori di cut-off specificiCiao Jarmo,
Grazie per il tuo aiuto ma per essere onesto, come nel seguente allegato, non riesco a eseguire lo script come hai fatto tu. quando ho controllato lo script (comando + 1) mostrato di seguito. Grazie per il tuo aiuto.
dt = New Table("Example",
Add Rows(20000),
invisible
);
colcount = 200;
For(i = 1, i <= colcount, i++,
newcol = dt << New Column(Char(i), Numeric, Continuous, Formula(
Random Normal() * 1000
));
dt << run formulas;
newcol << delete formula;
);
start = Tick Seconds();
colnames = dt << Get Column Names("String");
newcol = dt << New Column("getname", Character, Nominal, Formula(
valid_idx = Loc(dt[Row(), colnames] > 1000);
If(N Items(valid_idx) > 0,
Concat Items(colnames[valid_idx], ", ")
,
""
);
));
dt << run formulas;
newcol << delete formula;
wait(0);
end = Tick Seconds();
show(end - start);
/*:
end - start = 0.683333333348855;
Re: ottenere il nome della colonna con valori di cut-off specificiIl mio script crea una nuova colonna "getname" con i valori

Con i tuoi dati, dopo aver corretto le tue colonne in numeriche (e aver eliminato Nessuna colonna)

Re: ottenere il nome della colonna con valori di cut-off specificiCiao Jarmo,
Grazie mille. Ma il risultato è "end - start = 0.0333333333255723;" Questa non è la nuova tabella. Potresti fornirmi altre soluzioni? Per favore, mostrami la seguente tabella dati su JMP.
Grazie
Re: ottenere il nome della colonna con valori di cut-off specificiPotrebbe essere abbastanza veloce
Names Default To Here(1);
// Create a sample data table
dt = New Table("Example",
Add Rows(20000),
invisible
);
colcount = 200;
For(i = 1, i <= colcount, i++,
newcol = dt << New Column(Char(i), Numeric, Continuous, Formula(
Random Normal() * 1000
));
dt << run formulas;
newcol << delete formula;
);
start = Tick Seconds();
colnames = dt << Get Column Names("String");
newcol = dt << New Column("getname", Character, Nominal, Formula(
valid_idx = Loc(dt[Row(), colnames] > 1000);
If(N Items(valid_idx) > 0,
Concat Items(colnames[valid_idx], ", ")
,
""
);
));
dt << run formulas;
newcol << delete formula;
wait(0);
end = Tick Seconds();
show(end - start);Re: ottenere il nome della colonna con valori di cut-off specificiCiao Jim,
Grazie per il tuo aiuto. Tuttavia, ho 180 colonne e 20000 righe in parole diverse e non riesco a inserirle tutte come script seguenti. Potresti fornirmi altri suggerimenti?
Grazie
Re: ottenere il nome della colonna con valori di cut-off specificiEcco come gestirei questa situazione

names default to here(1);
dt = New Table( "Example",
Add Rows( 6 ),
New Column( "A*1:01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[10.67, 0, 9040.2999999999993, 34.399999999999999, 9190.2000000000007, 0
]
)
),
New Column( "A*2:01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [0, 0, 345.30000000000001, 4566, 13567, 0] )
),
New Column( "B*9:02",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [9520.2299999999996, 0, 345.89999999999998, 45, 3456, 0] )
),
New Column( "C*10:01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [15000.1, 0, 999.89999999999998, 7, 6789, 0] )
),
New Column( "DR*56:01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [90.560000000000002, 0, 345, 0, 9088, 0] )
),
New Column( "DP*07_G",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [40.890000000000001, 9.5600000000000005, 10.5, 0, 0, 0] )
)
);
dt << New Column( "Get Name",character);
colNames = dt << get column names( continuous,string );
For Each Row(
theList = {};
For Each( {col, i}, colNames,
If( As Column( col ) > 3000,
Insert Into( theList, col )
)
);
:Get Name = Concat Items( theList, "," );
);