Calcola la differenza di colonna per altri livelli di colonna in cui il ritardo variaHo una colonna :EVENT (carattere-nominale) con vari valori. Anche un'altra colonna :datetime (numerico-continuo). Ho la colonna :datetime ordinata in ordine crescente. Sono interessato ad avere un'altra colonna che calcoli ogni volta che c'è un evento "CONNECT", qual è la differenza di tempo tra questo e l'ultimo evento "DISCONNECT". Il problema è che il ritardo può variare tra un CONNECT e un DISCONNECT precedente (vedi foto sotto) e preferirei anche mantenere questo formato di tabella alto. Una soluzione per datetime ordinate in ordine crescente sarebbe apprezzata, ma anche non ordinate sarebbe utile.

Analisi e modellazione dei dati di baseEsplorazione e visualizzazione dei datiRe: Calcola la differenza di colonna per altri livelli di colonna in cui il ritardo variaAd esempio, puoi utilizzare la variabile nella formula per memorizzare il valore dell'ultima disconnessione
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(12),
Compress File When Saved(1),
New Column("E", Character, "Nominal", Set Values({"A", "B", "Disc", "Con", "A", "B", "C", "B", "Disc", "A", "B", "Con"})),
New Column("T", Numeric, "Continuous", Format("Best", 12), Set Values([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]))
);
dt << New Column("Dif", Numeric, Continuous, Formula(
If(Row() == 1,
last_disc = .;
retval = .;
);
If(:E == "Disc",
last_disc = :T;
retval = .;
, :E == "Con",
retval = :T - last_disc
,
retval = .;
);
retval;
));

Re: Calcola la differenza di colonna per altri livelli di colonna in cui il ritardo variaQuesto approccio ha funzionato alla grande, grazie!
Re: Calcola la differenza di colonna per altri livelli di colonna in cui il ritardo variaPuoi anche usare le matrici
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(12),
Compress File When Saved(1),
New Column("E", Character, "Nominal", Set Values({"A", "B", "Disc", "Con", "A", "B", "C", "B", "Disc", "A", "B", "Con"})),
New Column("T", Numeric, "Continuous", Format("Best", 12), Set Values([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]))
);
events = :E << get values;
times = :T << get values;
discs = Loc(events, "Disc");
cons = Loc(events, "Con");
difs = J(1, N Rows(dt), .);
difs[cons] = times[cons] - times[discs];
dt << new column("difs", numeric, continuous, values(difs));
Si basa su alcune ipotesi, ma può essere reso più robusto per tutti i tipi di casi limite (Loc Sorted può essere utile per qualcosa del genere, a volte anche KDTable/VPTree).
Re: Calcola la differenza di colonna per altri livelli di colonna in cui il ritardo variaPer complicare un po' le cose, ci sono momenti in cui un evento CONNECT può comparire più volte prima che si presenti un evento DISCONNECT. In questo caso, vorrei che la differenza venisse calcolata solo sul primo evento CONNECT che compare dopo un evento DISCONNECT. C'è una piccola modifica allo script che può adattarsi a questo? Grazie ancora per il tuo aiuto.
Re: Calcola la differenza di colonna per altri livelli di colonna in cui il ritardo variaEcco una modifica al codice @jthi che dovrebbe gestire questo problema.
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(12),
Compress File When Saved(1),
New Column("E", Character, "Nominal", Set Values({"A", "B", "Disc", "Con", "A", "B", "C", "B", "Disc", "A", "B", "Con"})),
New Column("T", Numeric, "Continuous", Format("Best", 12), Set Values([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]))
);
dt << New Column("Dif", Numeric, Continuous, Formula(
If(Row() == 1,
last_disc = .;
retval = .;
);
If(:E == "Disc",
last_disc = :T;
retval = .;
firstCon = .;
, :E == "Con",
If(ismissing(firstcon), firstcon=:t);
retval = firstcon - last_disc
,
retval = .;
);
retval;
));
Ti consiglio di prenderti del tempo per leggere la Scripting Guide, disponibile in JMP Help. Inoltre, prenditi del tempo per studiare il codice fornito dai membri del Forum di discussione che hanno risposto. Le modifiche allo script di Jarmo non richiedevano alcuna nuova conoscenza di scripting. Richiedevano solo un po' di logica aggiuntiva aggiunta al flusso dello script. Dovrebbe essere l'obiettivo di un utente essere in grado di apportare i propri miglioramenti agli script