Valores anteriores y siguientes que no faltan en una columnaSoy bastante nuevo en JMP y me encontré con un problema con el que realmente estoy luchando. Yo uso JMP Pro 17. Tengo una hoja de datos con una columna con la distancia desde un punto de partida (“Distancia”) y una columna con un valor de intensidad de señal a esa distancia (“Señal”). Encontré máximos locales de señal (picos) creando una columna de fórmula que produce un 1 si el valor de la señal a esa distancia es el valor más grande dentro de un rango determinado (Señal[fila] == max(Señal[fila-n, fila +n]), más falta. Mi problema, sin embargo, es el siguiente: deseo hacer otra columna de fórmula que proporcione la distancia en cada pico al pico más cercano.
En otras palabras, deseo, si "¿Pico?" == 1, encuentre el valor de distancia en las filas anterior y siguiente donde "¿Pico?" == 1, encuentre el valor absoluto de la diferencia entre la distancia en la fila actual y la distancia en esas filas, y obtenga el mínimo de esos dos valores.
Hasta ahora, he creado una “columna auxiliar” que, si la fila contiene un máximo de señal local, proporciona la distancia en ese valor. En otras palabras, tengo una columna con los valores de distancia en los valores máximos de la señal y valores faltantes en todas las filas que no son picos. Sin embargo, no puedo encontrar una manera de definir mediante la fórmula "valor no faltante anterior" o "valor no faltante siguiente". Estaría muy agradecido por cualquier consejo, ya sea sobre cómo hacer una fórmula para esto, o si hay mejores maneras de resolver el problema real de encontrar la distancia mínima entre picos.
Análisis y modelado de datos básicosExploración y visualización de datosRe: Valores anteriores y siguientes que no faltan en una columnaPrimera idea que me vino a la mente, así que parece bastante complicada.
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);
,
.
);
));

Re: Valores anteriores y siguientes que no faltan en una columna¡¡Muchas gracias!! Funciona maravillosamente. Haré todo lo posible para seguir y tratar de comprender su fórmula.
Si se me permite, me gustaría hacerle una pregunta adicional, bastante relacionada, a usted o a cualquier otra persona que lea aquí.
A continuación, encuentro la distancia mínima entre picos en dos canales. Es decir, tengo Distancia, Señal 1 y Señal 2, encontré los picos en cada una y, gracias a la fantástica ayuda de jthi, ahora puedo encontrar las distancias mínimas entre picos de la Señal 1 y la Señal 2. ¿Existe una fórmula? ¿Me vendría bien encontrar en los picos de la señal 1 la distancia hasta el pico más cercano de la señal 2? En otras palabras, si usa la imagen adjunta en la respuesta de jthi anterior, agregue una columna "Picos2" y use una fórmula para, si "Picos" no falta, encontrar el mínimo de los valores absolutos de la diferencia entre "Picos" y ¿Los valores anteriores y siguientes que no faltan de "Peaks2"?
Re: Valores anteriores y siguientes que no faltan en una columnaUna idea similar todavía debería funcionar.
Ver más...
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);
,
.
);
));

Dependiendo de cómo utilizará estos datos y de lo cómodo que se sienta con la programación, tal vez consideraría crear algunas funciones, ya que pueden hacer que el código sea más fácil de entender (como "buscar la fila anterior", "buscar la siguiente fila", "buscar la fila más cercana"). fila",...).
Re: Valores anteriores y siguientes que no faltan en una columna¡Muchas gracias de nuevo! Funciona igual de hermoso. Y estoy empezando a comprender su código.
Gracias por el consejo. Como mencioné, soy bastante nuevo en JMP y también en la programación en general. Pero sin duda lo tendré en cuenta, sobre todo a medida que adquiera más experiencia. ¡Gracias de nuevo, te deseo todo lo mejor!