Valori non mancanti precedente e successivo in una colonnaSono abbastanza nuovo in JMP e ho riscontrato un problema con il quale sto davvero lottando. Utilizzo JMP Pro 17. Ho una scheda tecnica con una colonna con la distanza da un punto iniziale ("Distanza") e una colonna con un valore di intensità del segnale a quella distanza ("Segnale"). Ho trovato i massimi locali (picchi) del segnale creando una colonna formula che restituisce 1 se il valore del segnale a quella distanza è il valore più grande all'interno di un determinato intervallo (Segnale[riga] == max(Segnale[riga-n, riga +n]), altrimenti mancante. Il mio problema, tuttavia, è il seguente; desidero creare un'altra colonna di formula che dia la distanza di ciascun picco al picco più vicino.
In altre parole, desidero, se “Picco?” == 1, trova il valore della distanza nella riga precedente e successiva dove “Picco?” == 1, trova il valore assoluto della differenza tra la distanza sulla riga corrente e la distanza su quelle righe e ottieni il minimo di questi due valori.
Finora ho creato una "colonna di supporto" che se la riga contiene un massimo di segnale locale fornisce la distanza a quel valore. In altre parole, ho una colonna con i valori della 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 tramite la formula “valore non mancante precedente” o “valore non mancante successivo”. Sarei estremamente grato per qualsiasi consiglio, su come creare una formula per questo, o se ci sono modi migliori per risolvere il problema reale di trovare la distanza minima tra i picchi.
Analisi e modellazione dei dati di baseEsplorazione e visualizzazione dei datiRi: 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);
,
.
);
));

Ri: Valori non mancanti precedenti e successivi in una colonnaGrazie mille!! Funziona magnificamente. Farò del mio meglio per esaminare e cercare di capire la tua formula.
Se posso, vorrei porre un'ulteriore domanda, piuttosto correlata, a te o a chiunque altro legga qui.
Successivamente, trovo la distanza minima tra i picchi in due canali. Cioè, ho Distanza, Segnale 1 e Segnale 2, ho trovato i picchi in ciascuno e grazie al fantastico aiuto di jthi ora posso trovare le distanze minime tra i picchi del Segnale 1 e del Segnale 2. Esiste una formula Potrei usare i picchi del segnale 1 per trovare la distanza dal picco più vicino del segnale 2? In altre parole, se si utilizza l'immagine allegata nella risposta di jthi sopra, aggiungere una colonna "Peaks2" e utilizzare una formula per se "Peaks" non è mancante, trovare il minimo dei valori assoluti della differenza tra "Peaks" e i valori non mancanti precedente e successivo di "Peaks2"?
Ri: Valori non mancanti precedenti e successivi in una colonnaUn'idea simile dovrebbe ancora funzionare
Visualizza 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 ti senti a tuo agio con la programmazione, potrei prendere in considerazione la creazione di alcune funzioni in quanto queste possono rendere il codice più facile da capire (come "trova la riga precedente", "trova la riga successiva", "trova il più vicino riga",...).
Ri: 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 già detto, sono abbastanza nuovo in JMP e anche nella programmazione in generale. Ma lo terrò sicuramente presente, soprattutto quando avrò più esperienza. Grazie ancora, ti auguro tutto il meglio!