obtenir le nom de la colonne avec des valeurs limites spécifiquesSalut,
J'essaie de compter et d'obtenir des noms de colonnes spécifiques à partir de ces exemples de données (mes données réelles contenaient 180 colonnes et 20 000 lignes).
Je veux sélectionner la colonne dont le seuil est > 1000
| Non. | A*1:01 | A*2:01 | B*9:02 | C*10:01 | RD*56:01 | DP*07_G | Obtenir le nom |
| 1 | 10.67 | 0 | 9520.23 | 15000,1 | 90.56 | 40,89 | B*9:02, C*10:01 |
| 2 | 0 | 0 | 0 | 0 | 0 | 9.56 | |
| 3 | 9040.3 | 345.3 | 345,9 | 999,9 | 345 | 10.5 | A*1:01 |
| 4 | 34.4 | 4566 | 45 | 7 | 0 | 0 | A*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 | |
| ... | | | | | | | |
J'essaye le script précédent comme celui-ci
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 ""
);
);
);Pourriez-vous s'il vous plaît corriger mes scripts, merci !
De plus, puis-je utiliser une matrice car je dois générer la "nouvelle colonne" de 180 colonnes.
Meilleur,
Mélange et nettoyage des donnéesRe : obtenir le nom de la colonne avec des valeurs seuils spécifiquesVoici comment je gérerais cela

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, "," );
);
Re : obtenir le nom de la colonne avec des valeurs seuils spécifiquesSalut Jim,
Merci pour votre aide. Cependant, j'ai 180 colonnes et 20 000 lignes de mots différents et je ne peux pas toutes les mettre comme scripts suivants. Pourriez-vous s'il vous plaît me fournir plus de suggestions ?
Merci
Re : obtenir le nom de la colonne avec des valeurs seuils spécifiquesCela pourrait être assez rapide
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 : obtenir le nom de la colonne avec des valeurs seuils spécifiquesSalut Jarmo,
Merci beaucoup. Mais le résultat est "fin - début = 0,0333333333255723 ;" Ce n'est pas la nouvelle table. pourriez-vous s'il vous plaît fournir plus de solutions? veuillez me montrer le tableau de données suivant sur JMP.
Merci
Re : obtenir le nom de la colonne avec des valeurs seuils spécifiquesMon script crée une nouvelle colonne "getname" avec les valeurs

Avec vos données, après avoir réparé vos colonnes à numérique (et déposez aucune colonne)

Re : obtenir le nom de la colonne avec des valeurs seuils spécifiquesSalut Jarmo,
Merci pour votre aide mais pour être honnête comme dans la pièce jointe suivante, je ne peux pas exécuter le script comme vous l'avez fait. quand j'ai vérifié le script (commande + 1) ci-dessous. Merci pour votre aide.
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 : obtenir le nom de la colonne avec des valeurs seuils spécifiquesVous devrez ouvrir votre table, réparer les colonnes puis exécuter la partie où la nouvelle colonne est créée
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;
Je vous suggère fortement de consulter le Guide de script de l'aide JMP.
Re : Obtenir le nom de la colonne avec des valeurs limites spécifiquesSalut Jarmo, avez-vous une idée pour extraire les valeurs de ceci qui sont supérieures à la coupure (si j'ai 50 colonnes) avec chaque nom de colonne (colonne getname sur un exemple)
Re : Obtenir le nom de la colonne avec des valeurs limites spécifiquesComment souhaitez-vous les extraire ? Ma solution ne crée-t-elle pas une nouvelle colonne dont les noms de colonnes sont des chaînes séparées par des espaces et des espaces ?

Souhaitez-vous vérifier les valeurs par colonne plutôt que par ligne ? Ou autre chose ?
Modifier:
Si vous voulez simplement une liste de colonnes différente, je devrais savoir comment la filtrer. Si vous voulez simplement toutes les colonnes, supprimez la fonction 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 : Obtenir le nom de la colonne avec des valeurs limites spécifiquesVoici une méthode alternative qui peut aider avec un grand nombre de colonnes
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 : Obtenir le nom de la colonne avec des valeurs limites spécifiques
Merci beaucoup, je voudrais clarifier cela. J'ai une autre colonne d'intérêt comme "alphabet d'intérêt" et je souhaite obtenir le nom et la valeur de toutes les colonnes avec des valeurs> 1 000 et toutes les colonnes correspondent à l'alphabet de la colonne d'intérêt.
Merci!
Re : Obtenir le nom de la colonne avec des valeurs limites spécifiquesMerci, Jim, mais cela ne fonctionne pas. Veuillez consulter le fichier ci-joint.
Re : Obtenir le nom de la colonne avec des valeurs limites spécifiquesIl est fort probable que faire quelque chose comme Jim l'a suggéré soit plus rapide et plus facile, mais vous pouvez faire quelque chose comme cela avec la méthode que j'ai démontrée.
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 : Obtenir le nom de la colonne avec des valeurs limites spécifiquesSi le script a été écrit pour s'exécuter avec une colonne appelée « Non » suivie de colonnes numériques. Votre table de données fournie comporte 2 colonnes de caractères en plus de la colonne numérique. Si vous supprimez les colonnes « Alphabet d'intérêt » et « Obtenir le nom et la valeur » et que vous exécutez ensuite le script, il fonctionne correctement.
Vous devriez pouvoir facilement modifier le script pour compenser les colonnes supplémentaires. Soit les supprimer dans le script avant de commencer à récupérer les noms de colonnes, soit les supprimer de la liste des noms de colonnes avant de traiter le For Each devrait fonctionner.
Re : Obtenir le nom de la colonne avec des valeurs limites spécifiquesMerci beaucoup. Ce script fonctionne. Cependant, je suis désolé que mes données d'origine soient plus compliquées que cela. L'alphabet d'intérêt comporte plusieurs « alphabet » et « nombres » séparés par "," (A1, B9) en tant que fichiers joints. Comment puis-je obtenir le nom et la valeur de la colonne qui mettent en corrélation l'alphabet d'intérêt de la colonne et le nom de la colonne.

Merci pour votre aide.
Re : Obtenir le nom de la colonne avec des valeurs limites spécifiquesComment ces « alphabets » sont-ils déterminés ? S'agit-il de tout ce qui se trouve après le dernier « _ » ? Si tel est le cas, vous devriez pouvoir apporter une très légère modification à mon script et prendre le dernier mot au lieu du premier et utiliser un séparateur différent, cette partie nécessite donc une légère modification
alph = Word(1, colname, "*");
Re : Obtenir le nom de la colonne avec des valeurs limites spécifiquesMerci pour votre suggestion. Si je veux faire correspondre le premier mot avant ":", cela devrait être ceci
alph = Word(1, colname, ":");
et si je veux faire correspondre le dernier mot après "_", ce devrait être ceci
alph = Word(-1, colname, "_");
Et si je dois faire correspondre avant ":" et après "_" simultanément ? Après avoir joint les scripts que j'ai exécutés pour chacun ci-dessus, je n'ai pas pu gérer la duplication (exactement la même chose).
Merci
Re : Obtenir le nom de la colonne avec des valeurs limites spécifiquesEn regardant votre tableau, le début et la fin seront différents (début A*1 et fin A1), vous devrez donc ajouter ces clés « supplémentaires » au tableau associatif pour effectuer la comparaison ET gérer les doublons plus tard.
Re : Obtenir le nom de la colonne avec des valeurs limites spécifiquesDe plus, si une colonne de l'alphabet concerné avait plus de 1, le script ne s'exécutait pas. Avez-vous une suggestion à ce sujet ?
Merci!
Re : Obtenir le nom de la colonne avec des valeurs limites spécifiquesMon script a traité les situations que vous avez évoquées. En fonction de la question posée, le script peut nécessiter une réécriture totale ou éventuellement quelques petites modifications.
Re : Obtenir le nom de la colonne avec des valeurs limites spécifiquesMerci Jarmo, je voudrais joindre le fichier qui est compatible avec ce que je veux faire ici. Je veux faire correspondre la colonne Alphabet composée de DOA et DO avec chaque colonne de DOA1*0x:0x,DOB1*0x:0x_DOx. Le DOA0x correspond à DOA1*0x (ne pas inclure après ":") et DOx ou DOB1*Ox correspond à DOx. Tous doivent avoir une valeur supérieure à 1000 pour être affichés dans la colonne de résultat. Je ne peux pas corriger la formule existante comme vous l'avez dit. Merci d'avance !
Re : Obtenir le nom de la colonne avec des valeurs limites spécifiquesPourquoi DOA1*0x ne correspondrait-il pas à DOx ?
Re : Obtenir le nom de la colonne avec des valeurs limites spécifiquesVoici une sorte de script, je suis toujours en train de deviner les règles correctes, donc je n'ai aucune idée s'il fait ce qu'il est censé faire
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;
Re : Obtenir le nom de la colonne avec des valeurs limites spécifiquesCela n’est pas égalé par la biologie.
Re : Obtenir le nom de la colonne avec des valeurs limites spécifiquesMerci, Jarmo. C'est du travail !