Tengo una tabla JMP que contiene datos medidos cada hora en aproximadamente 50 estaciones diferentes.En cada estación los datos a veces se reportan en ppm, otras veces en ppb, ocasionalmente en ambas unidades y ocasionalmente no hay ninguna medición.Es un conjunto de datos bastante grande y me pregunto: ¿cómo puedo automatizar la combinación de las columnas que pertenecen a cada estación en una sola columna en un sistema de unidades?¿O tengo que crear manualmente una nueva columna para cada estación e ingresar una fórmula para realizar la conversión? Solo intento acelerar este paso de preparación de datos sin usar Excel.
¡Gracias por su amabilidad!
GRACIAS.¡FUNCIONÓ!Ahora todo está en ppm y puedo continuar con mi análisis.
Aquí hay un script que, dada la estructura que mostró, convertirá todos los datos a ppm y eliminará las columnas de ppb.
Es solo el punto de partida, y si más detalles cambian los cálculos, se pueden incluir en la lógica.
Names Default To Here( 1 );
dt = Current Data Table();
For( i = 1, i <= N Cols( dt ), i++,
If( Trim( Word( -1, Column( dt, i ) << get name, ":" ) ) == "ppm",
ppbCol = Trim( Substr( Column( dt, i ) << get name, 1, Contains( Column( dt, i ) << get name, "ppm" ) - 1 ) || "ppb" );
For( k = 1, k <= N Rows( dt ), k++,
Column( dt, i )[k] = Sum( Column( dt, i )[k], Column( dt, ppbCol )[k]/1000 )
);
)
);
// Get rid of ppb columns
For( i = N Cols( dt ), i >= 1, i--,
If( Trim( Word( -1, Column( dt, i ) << get name, ":" ) ) == "ppb",
dt << delete columns( i )
)
);
Sin duda, hay muchas formas de hacer esto; esta es la primera que me vino a la mente, suponiendo que el formato de columna en su ejemplo es consistente. Puede ejecutar el script al final de la publicación para ver un ejemplo completo o seguir los comentarios verdes en el script y las capturas de pantalla a continuación:
Reúna todos los datos de la estación en una sola columna usando Stack:

Fórmula para Estación (se muestra tanto en el formato 'bonito' como en el código que obtienes al hacer doble clic en la fórmula:

La fórmula para la unidad es similar:

Fórmula para cuentas de datos para cada unidad potencial:

Tabular se basa en el tipo de datos ordinal o nominal para Intervalos y Estación:

Luego use la tabla Convertir en datos del menú de tabulación.
Script para recrear un ejemplo:
//To see a full example you can copy this this into a new script window and press Run, or just following along
//with the green comments
Names default to here(1);
//Recreate part of your sample data table, you could skip this part and open your original data instead
//Note that the times are ordinal or nominal data types, this will be imporant in the tabulate platform later
dt = New Table( "Raw Data",
Add Rows( 2 ),
New Column( "IntervalStart", Numeric, "Ordinal", Format( "m/d/y h:m", 19 ), Input Format( "m/d/y" ),
Set Values( [3503606400, 3503610000] ),
),
New Column( "IntervalEnd", Numeric, "Ordinal", Format( "m/d/y h:m", 19 ), Input Format( "m/d/y h:m" ),
Set Values( [3503609940, 3503613540] )
),
New Column( "StationName: Anzac-Unit:ppb", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2] ) ),
New Column( "StationName: Anzac-Unit:ppm", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [., .] ) ),
New Column( "StationName: Ardrossan-Unit: ppb", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [., .] ) ),
New Column( "StationName: Ardrossan-Unit: ppm", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [11, 12] ) )
);
//Get a reference to your current data table
dt = Current data table();
//Stack all of the columns - use Tables > Stack and include all of the columns except the first two which are times
dtStacked = dt << Stack(
columns(
(dt << Get Column Names())[3::n col(dt)]
),
Source Label Column( "Label" ),
Stacked Data Column( "Data" )
);
//Now add three new columns to find the station and units, and calculate the concentration based on the units
//you should be able to copy and paste the part inside the 'Formula' function below into the formulas of your new columns
dtStacked << New Column("Station", Character, "Nominal", Formula(Words(:Label, "-")[1]));
dtStacked << New Column("Unit", Character, "Nominal", Formula(Words(:Label, "-")[2]), Set Display Width(65));
dtStacked << New Column("Data (ppm)", Numeric, "Continuous", Format("Best", 12), Formula(If(Contains(:Unit, "ppm"), :Data, Contains(:Unit, "ppb"), :Data / 1000)));
//Put back in standard format using the tabulate platform. Drag times and the station into
//columns on the left and add the mean and N as data fields. Note that in the resulting table anything
//with a N(Data) greater than 1 might have a problem!
(dtStacked << Tabulate(
Show Control Panel( 0 ),
Add Table(
Column Table( Analysis Columns( :Data ), Statistics( Mean, N ) ),
Row Table( Grouping Columns( :IntervalStart, :IntervalEnd, :Station ) )
)
)) << Make Into Data Table;
Hola Jim,
Publiqué una imagen de cómo se ven los datos, en respuesta a su pregunta.Por favor dígame los pasos para cambiar los datos existentes.
Gracias.
Hola,
Así es como se ven los datos.El nombre de la columna dice la estación y las unidades de medida.
Gracias amablemente por la ayuda.
¿Los datos aparecen como numéricos (sin las unidades, o unidades en un campo separado) o como datos de caracteres donde las unidades aparecen con el número (por ejemplo, 13 ppm)?Sería más fácil si pudiera proporcionar un ejemplo de cómo aparecen los datos.Una fórmula debe realizar la conversión que desea, pero exactamente qué fórmula depende del aspecto de los datos.
Se puede utilizar un script muy simple para cambiar los valores directamente en la columna en la que vienen.O puede utilizar la herramienta Recodificar para hacer lo mismo, en un formato interactivo.¿Cómo se determina cuáles son las unidades de medida?¿Hay una columna separada que indique eso?