JSL per generare la differenza e la media delle colonne corrispondentiCiao,
Spero di ricevere aiuto su quanto segue:
In allegato file JMP con la seguente tabella.

Il mio set di dati tipico/iniziale contiene:
1. un identificatore "Tipo"
2. un insieme di un numero sconosciuto di colonne con lo stesso prefisso e vari suffissi numerici, ad es Un numero1, Un numero2, Un numero3...
3. un secondo set dello stesso numero di colonne di #2 sopra, con lo stesso prefisso e suffisso corrispondente di #2, ad esempio B num1, B num2, B num3...
Posso avere aiuto per scrivere uno script jsl per generare le colonne per accoppiare la colonna set A e set B per calcolare:
Formula( (:B 1.0 - :B 0.5) / (:A 1.0 - :A 0.5) ) ),
Formula( (:B 1,3 - :B 0,5) / (:A 1,3 - :A 0,5) ) ),
Formula( (:B 1.3 - :B 1.0) / (:A 1.3 - :A 1.0) ) ),
Quindi, genera una colonna Media ("B/A Avg") per prendere la media di tutte le colonne create. Notato che le colonne generate sopra possono essere qualsiasi numero. Potrebbero essere 3, o 2, o 6...
Alla fine, mi interessa soprattutto ottenere la colonna finale di "B/A Avg", le colonne provvisorie sono facoltative se ciò semplifica lo script.
Per favore fatemi sapere se posso chiarire qualcosa nelle mie domande. Grazie mille in anticipo.
Automazione e scriptingAnalisi e modellazione dei dati di baseRi: JSL per generare la differenza e la media delle colonne corrispondentiCosa determina le coppie di colonne utilizzate per il calcolo?
Ri: JSL per generare la differenza e la media delle colonne corrispondentiAvere lo stesso suffisso (numero). Ad esempio, da 0,5 a 0,5, da 1,0 a 1,0, da 1,3 a 1,3, ecc...
Ri: JSL per generare la differenza e la media delle colonne corrispondentiSe ho le colonne A0.5, A1.0, A1.3, B0.5, B1.0 e B1.3, come faccio a sapere che ho bisogno esattamente di (B1.0-B0.5)/(A1.0- A0.5), (B1.3-B0.5)/(A1.3-A0.5) e (B1.3-B1.0)/(A1.3-A1.0)?
Ri: JSL per generare la differenza e la media delle colonne corrispondentiGrazie mille per aver lavorato pazientemente con me e mi scuso per non essere stato chiaro al 100% delle mie intenzioni.
Per l'equazione, sarà sempre: ( B num1 - B num2 ) / ( A num1 - A num2 )
Poiché otterremo sempre lo stesso insieme di suffissi tra il gruppo A e il gruppo B, il mio obiettivo è ottenere tutte le possibili combinazioni tra il gruppo A, che può essere limitato solo al suffisso con valore più alto - suffisso con valore più basso.
In alternativa, se semplifichiamo lo script, potremmo trovare la differenza tra qualsiasi coppia, ad esempio includendole entrambe (B1.0-B0.5)/(A1.0-A0.5) e (B0.5-B1.0)/(A0.5-A1.0). In questo modo, la media sarà sempre la stessa solo del valore superiore-inferiore.
Ri: JSL per generare la differenza e la media delle colonne corrispondentiEcco il mio metodo che crea le nuove colonne che desideri.
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, "," ) || ")));"
)
);Ri: JSL per generare la differenza e la media delle colonne corrispondentiQuesto può anche dare qualche idea
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))
));
));Ri: JSL per generare la differenza e la media delle colonne corrispondentiGrazie mille Jarmo. Ho imparato tanti nuovi modi di scripting da questo esempio. Apprezzo il tuo aiuto.
Ri: JSL per generare la differenza e la media delle colonne corrispondentiGrazie mille, Jim, per il tuo aiuto. Molto semplice e facile da capire. Apprezzalo!