JSL pour générer la différence et la moyenne des colonnes correspondantesBonjour,
J'espère obtenir de l'aide sur les points suivants :
Fichier JMP joint avec le tableau suivant.

Mon ensemble de données typique/de départ contient :
1. un identifiant "Type"
2. un ensemble de nombres inconnus de colonnes avec le même préfixe et différents suffixes numériques, par exemple Un num1, Un num2, Un num3...
3. un deuxième ensemble du même nombre de colonnes qu'au n° 2 ci-dessus, avec le même préfixe et suffixe correspondant qu'au n° 2, par exemple B num1, B num2, B num3...
Puis-je obtenir de l'aide pour écrire un script jsl pour générer les colonnes permettant d'associer les colonnes de l'ensemble A et de l'ensemble B à calculer :
Formule( (:B 1,0 - :B 0,5) / (:A 1,0 - :A 0,5) ) ),
Formule( (:B 1,3 - :B 0,5) / (:A 1,3 - :A 0,5) ) ),
Formule( (:B 1.3 - :B 1.0) / (:A 1.3 - :A 1.0) ) ),
Ensuite, générez une colonne Moyenne ("B/A Avg") pour prendre la moyenne de toutes les colonnes créées. Notez que les colonnes générées ci-dessus peuvent contenir n'importe quel nombre. Cela pourrait être 3, ou 2, ou 6...
En fin de compte, je suis surtout intéressé par la dernière colonne de "B/A Avg", les colonnes intermédiaires sont facultatives si cela simplifie le script.
S'il vous plaît laissez-moi savoir si je peux clarifier quelque chose dans mes questions. Merci beaucoup d'avance.
Automatisation et scriptsAnalyse et modélisation des données de baseRe : JSL pour générer la différence et la moyenne des colonnes correspondantesQu'est-ce qui détermine les paires de colonnes utilisées pour le calcul ?
Re : JSL pour générer la différence et la moyenne des colonnes correspondantesAyant le même suffixe (numéro). Par exemple, 0,5 à 0,5, 1,0 à 1,0, 1,3 à 1,3, etc...
Re : JSL pour générer la différence et la moyenne des colonnes correspondantesSi j'ai les colonnes A0.5, A1.0, A1.3, B0.5, B1.0 et B1.3, comment savoir si j'ai exactement besoin de (B1.0-B0.5)/(A1.0- A0.5), (B1.3-B0.5)/(A1.3-A0.5) et (B1.3-B1.0)/(A1.3-A1.0) ?
Re : JSL pour générer la différence et la moyenne des colonnes correspondantesMerci beaucoup d'avoir travaillé patiemment avec moi et excusez-vous de ne pas avoir été clair à 100 % sur votre intention.
Pour l'équation, ce sera toujours : ( B num1 - B num2 ) / ( A num1 - A num2 )
Puisque nous obtiendrons toujours le même ensemble de suffixes entre le groupe A et le groupe B, mon objectif est d'obtenir toutes les combinaisons possibles parmi le groupe A, qui peuvent être limitées uniquement à un suffixe de valeur supérieure - un suffixe de valeur inférieure.
Alternativement, si cela simplifie le script, nous pouvons trouver la différence entre n'importe quelle paire, par exemple en incluant les deux (B1.0-B0.5)/(A1.0-A0.5) et (B0.5-B1.0)/(A0.5-A1.0). De cette façon, la moyenne sera toujours la même que celle supérieure-inférieure.
Re : JSL pour générer la différence et la moyenne des colonnes correspondantesVoici ma méthode qui crée les nouvelles colonnes souhaitées.
names default to here(1);
dt=current data table();
// Set Prefixes
pre1 = "A";
pre2 = "B";
// Get all levels using Pre1 columns to find the levels
theColumnNames = dt << get column names( string, continuous );
levels = {};
For Each( {col, i}, theColumnNames,
if(word(1,col," ")==pre1,
insert into(levels,trim(substr(col,length(pre1)+1)))
)
);
// Create new columns.
// This is accomplished by creating a character string that is the JSL statement that
// is required to create the new column and it's formula
meanColsList = {};
For( i = 2, i <= N Items( levels ), i++,
For( k = 1, k <= i - 1, k++,
Eval(
Parse(
"dt << New Column( \!"" || pre2 || "/" || pre1 || " " || levels[i] || "-" || levels[k] ||
"\!", formula( (:" || pre2 || " " || levels[i] || " - :" || pre2 || " " || levels[k] || ")
/ (:" || pre1 || " " || levels[i] || " - :" || pre1 || " " || levels[k] || ") ) );"
)
);
insert into( meanColsList, ":\!"" || pre2 || "/" || pre1 || " " || levels[i] || "-" || levels[k] || "\!"n");
);
);
Eval(
Parse(
"dt << New Column( \!"" || pre2 || "/" || pre1 || " Avg\!", formula( Sum(" ||
Concat Items( meanColsList, "," ) || ") / Number(" ||
Concat Items( meanColsList, "," ) || ")));"
)
);Re : JSL pour générer la différence et la moyenne des colonnes correspondantesCela peut aussi donner quelques idées
Names Default To Here(1);
dt = Open("$DOWNLOADS/Question - Auto Col Diff and Avg.jmp");
dt << Clear Column Selection << Clear Select;
col_list = dt << Get Column Names("String");
// Get column types
col_rgx_pattern = "^(.?) (\d+.\d+)";
aa = Associative Array();
For Each({col_name}, col_list,
rgx_result = Regex(col_name, col_rgx_pattern);
If(!IsMissing(rgx_result),
parts = Words(rgx_result);
If(N Items(parts) == 2,
If(!Contains(aa, parts[1]),
aa[parts[1]] = {};
);
Insert Into(aa[parts[1]], parts[2]);
);
);
);
// Check that all different columns have same number parts (ignored in this case)
// Create combinations
ordered_num_parts = Reverse(Sort List(aa[aa << first])); // sort from largest to smallest, works in this simple case
pairs = {};
For(i = 1, i <= N Items(ordered_num_parts) - 1, i++,
For(j = i + 1, j <= N Items(ordered_num_parts), j++,
cur_pair = Eval List({ordered_num_parts[i], ordered_num_parts[j]});
Insert Into(pairs, Eval List({cur_pair}));
);
);
// Create new columns
avg_expr = Expr(Mean());
For Each({pair}, pairs,
f_expr = Substitute(
Expr(
(_last_numerator_ - _first_numerator_) / (_last_denominator_ - _first_denominator_)
),
Expr(_last_numerator_), Name Expr(AsColumn(dt, "B " || pair[1])),
Expr(_first_numerator_), Name Expr(AsColumn(dt, "B " || pair[2])),
Expr(_last_denominator_), Name Expr(AsColumn(dt, "A " || pair[1])),
Expr(_first_denominator_), Name Expr(AsColumn(dt, "A " || pair[2]))
);
Eval(EvalExpr(new_col = dt << New Column("B/A " || pair[1] || "-" || pair[2], Numeric, Continuous, Formula(
Expr(Name Expr(f_expr))
))));
Insert Into(avg_expr, Name Expr(AsColumn((new_col << get name))));
);
Eval(EvalExpr(
dt << New Column("B/A AVG", Numeric, Continuous, Formula(
Expr(Name Expr(avg_expr))
));
));Re : JSL pour générer la différence et la moyenne des colonnes correspondantesMerci beaucoup Jarmo. J'ai appris tellement de nouvelles façons de créer des scripts grâce à cet exemple. Apprécier ton aide.
Re : JSL pour générer la différence et la moyenne des colonnes correspondantesMerci beaucoup, Jim, pour votre aide. Très simple et facile à comprendre. Appréciez-le !