Valores no faltantes anteriores y siguientes en una columnaSoy bastante nuevo en JMP y me he encontrado con un problema con el que estoy luchando realmente. Uso JMP Pro 17. Tengo una hoja de datos con una columna con la distancia desde un punto de inicio ("Distancia") y una columna con un valor de intensidad de señal a esa distancia ("Señal"). He encontrado máximos locales de señal (picos) haciendo una columna de fórmula que arroja un 1 si el valor de la señal a esa distancia es el valor más grande dentro de un rango dado (Señal[fila] == máx(Señal[fila-n, fila+n]), de lo contrario 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, encontrar el valor de la distancia en la fila anterior y la siguiente donde “Pico?” == 1, encontrar el valor absoluto de la diferencia entre la distancia en la fila actual y la distancia en esas filas, y obtener 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 pico de la señal y los valores faltantes en todas las filas que no son picos. Sin embargo, no puedo encontrar una forma 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 formas 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 columna¡Muchas gracias de nuevo! Funciona igual de bien y estoy empezando a entender tu código.
Gracias por el consejo. Como ya he dicho, soy bastante nuevo en JMP y también en la programación en general, pero lo tendré en cuenta, sobre todo a medida que vaya adquiriendo más experiencia. ¡Gracias de nuevo y te deseo todo lo mejor!
Re: Valores anteriores y siguientes que no faltan en una columnaUna idea similar debería seguir funcionando
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 usarás estos datos y de lo cómodo que te sientas con la programación, tal vez consideraría crear algunas funciones que puedan hacer que el código sea más fácil de entender (como "encontrar fila anterior", "encontrar fila siguiente", "encontrar fila más cercana", ...).
Re: Valores anteriores y siguientes que no faltan en una columna¡Muchas gracias! Funciona de maravilla. Haré todo lo posible por leerlo y tratar de entender tu fórmula.
Si me lo permite, me gustaría hacerle una pregunta adicional, bastante relacionada, a usted o a cualquier otra persona que lea aquí.
A continuación, estoy encontrando la distancia mínima entre picos en dos canales. Es decir, tengo Distancia, Señal 1 y Señal 2, he encontrado los picos en cada uno, y gracias a la fantástica ayuda de jthi ahora puedo encontrar las distancias mínimas entre picos de Señal 1 y Señal 2. ¿Hay alguna fórmula que pueda usar para, en los picos de Señal 1, encontrar la distancia al pico más cercano de Señal 2? En otras palabras, si se usa la imagen adjunta en la respuesta de jthi anterior, se agrega una columna "Picos2" y se usa una fórmula para, si "Picos" no falta, encontrar el mínimo de los valores absolutos de la diferencia entre "Picos" y los valores no faltantes anterior y siguiente de "Picos2".
Re: Valores anteriores y siguientes que no faltan en una columnaPrimera idea que me vino a la mente, aunque 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);
,
.
);
));
