Valori non mancanti precedenti e successivi in una colonnaSono abbastanza nuovo su JMP e mi sono imbattuto in un problema con cui sto davvero lottando. Uso JMP Pro 17. Ho un foglio dati con una colonna con la distanza da un punto di partenza ("Distanza") e una colonna con un valore di intensità del segnale a quella distanza ("Segnale"). Ho trovato i massimi locali del segnale (picchi) creando una colonna formula che produce 1 se il valore del segnale a quella distanza è il valore più grande all'interno di un dato intervallo (Segnale[riga] == max(Segnale[riga-n, riga+n]), altrimenti manca. Il mio problema, tuttavia, è il seguente; desidero creare un'altra colonna formula che fornisca la distanza a ogni picco dal picco più vicino.
In altre parole, desidero, se "Picco?" == 1, trovare il valore della distanza nella riga precedente e in quella successiva in cui "Picco?" == 1, trovare il valore assoluto della differenza tra la distanza nella riga corrente e la distanza in quelle righe e ottenere il minimo di quei due valori.
Finora ho creato una "colonna di supporto" che, se la riga contiene un segnale massimo locale, fornisce la distanza a quel valore. In altre parole, ho una colonna con i valori di distanza ai valori di picco del segnale e i valori mancanti in tutte le righe che non sono picchi. Tuttavia, non riesco a trovare un modo per definire con la formula "valore non mancante precedente" o "valore non mancante successivo". Vi sarei estremamente grato per qualsiasi consiglio, sia su come creare una formula per questo, sia se ci sono modi migliori per risolvere il problema effettivo di trovare la distanza minima tra i picchi.
Analisi e modellazione dei dati di baseEsplorazione e visualizzazione dei datiRe: Valori non mancanti precedenti e successivi in una colonnaGrazie mille, ancora! Funziona altrettanto bene. E sto iniziando a capire il tuo codice.
Grazie per il consiglio. Come ho detto, sono piuttosto nuovo di JMP, e anche della programmazione in generale. Ma lo terrò sicuramente a mente, soprattutto man mano che acquisirò più esperienza. Grazie ancora, vi auguro il meglio!
Re: Valori non mancanti precedenti e successivi in una colonnaUn'idea simile dovrebbe ancora funzionare
Vedi altro...
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(12),
Compress File When Saved(1),
New Column("Peak1", Numeric, "Continuous",
Set Values([., 1, ., ., 2.5, ., ., ., ., 3.1, ., ., 2])
),
New Column("Peak2", Numeric, "Continuous",
Set Values([0.5, 0.9, ., 2, ., 4, ., ., ., ., ., 5, .])
)
);
dt << New Column("Peak1ToPeak1", Numeric, Continuous, Formula(
As Constant(m = :Peak1 << get values;
peak_rows = Loc(m);
peak_values = m[peak_rows];
);
If(!IsMissing(:Peak1),
peak_distances = peak_rows - Row();
previous_peak = Loc(peak_distances < 0);
If(N Items(previous_peak) == 0,
previous_distance = .;
,
previous_distance = Abs(m[Row()] - peak_values[Reverse(previous_peak)[1]]);
);
next_peak = Loc(peak_distances > 0);
If(N Items(next_peak) == 0,
next_distance = .;
,
next_distance = Abs(m[Row()] - peak_values[next_peak[1]]);
);
Min(previous_distance, next_distance);
,
.
);
));
dt << New Column("Peak1ToPeak2", Numeric, Continuous, Formula(
As Constant(m = :Peak2 << get values;
peak_rows = Loc(m);
peak_values = m[peak_rows];
);
If(!IsMissing(:Peak1),
peak_distances = peak_rows - Row();
previous_peak = Loc(peak_distances < 0);
If(N Items(previous_peak) == 0,
previous_distance = .;
,
previous_distance = Abs(:Peak1[Row()] - peak_values[Reverse(previous_peak)[1]]);
);
next_peak = Loc(peak_distances > 0);
If(N Items(next_peak) == 0,
next_distance = .;
,
next_distance = Abs(:Peak1[Row()] - peak_values[next_peak[1]]);
);
Min(previous_distance, next_distance);
,
.
);
));

A seconda di come utilizzerai questi dati e di quanto sei a tuo agio con la programmazione, potresti prendere in considerazione la creazione di alcune funzioni, in quanto possono rendere il codice più facile da comprendere (ad esempio "trova la riga precedente", "trova la riga successiva", "trova la riga più vicina",...).
Re: Valori non mancanti precedenti e successivi in una colonnaGrazie mille!! Funziona benissimo. Farò del mio meglio per esaminare e cercare di capire la tua formula.
Se mi è concesso, vorrei porre un'ulteriore domanda, piuttosto correlata a quella che ho appena letto, a te o a chiunque altro legga qui.
Poi, sto trovando la distanza minima tra i picchi in due canali. Cioè, ho Distanza, Segnale 1 e Segnale 2, ho trovato i picchi in ognuno e, grazie al fantastico aiuto di jthi, ora posso trovare le distanze minime tra i picchi di Segnale 1 e Segnale 2. Esiste una formula che potrei usare per trovare la distanza dal picco più vicino di Segnale 2 ai picchi di Segnale 1? In altre parole, se si usa l'immagine allegata nella risposta di jthi sopra, aggiungere una colonna "Picchi2" e usare una formula per se "Picchi" non è mancante, trovare il minimo dei valori assoluti della differenza tra "Picchi" e i valori non mancanti precedenti e successivi di "Picchi2"?
Re: Valori non mancanti precedenti e successivi in una colonnaLa prima idea che mi è venuta in mente, quindi sembra abbastanza complicata
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(12),
Compress File When Saved(1),
New Column("Peaks", Numeric, "Continuous",
Set Values([., 1, ., ., 2.5, ., ., ., ., 3.1, ., ., 2])
)
);
dt << New Column("DistanceToPeak", Numeric, Continuous, Formula(
As Constant(m = :Peaks << get values;
peak_rows = Loc(m);
peak_values = m[peak_rows];
);
If(!IsMissing(:Peaks),
peak_distances = peak_rows - Row();
previous_peak = Loc(peak_distances < 0);
If(N Items(previous_peak) == 0,
previous_distance = .;
,
previous_distance = Abs(m[Row()] - peak_values[Reverse(previous_peak)[1]]);
);
next_peak = Loc(peak_distances > 0);
If(N Items(next_peak) == 0,
next_distance = .;
,
next_distance = Abs(m[Row()] - peak_values[next_peak[1]]);
);
Min(previous_distance, next_distance);
,
.
);
));
