J'ai une table JMP qui contient des données mesurées toutes les heures dans environ 50 stations différentes.À chaque station, les données sont parfois rapportées en ppm, d'autres fois en ppb, parfois dans les deux unités et parfois, il n'y a aucune mesure.Il s'agit d'un ensemble de données assez volumineux et je me demande comment automatiser la combinaison des colonnes relatives à chaque station en une seule colonne dans un seul système d'unités.Ou dois-je créer manuellement une nouvelle colonne pour chaque station et saisir une formule pour effectuer la conversion ? J'essaie simplement d'accélérer cette étape de préparation des données sans utiliser Excel.
MERCI.ÇA A MARCHÉ!Tout est désormais en ppm et je peux continuer mon analyse.
Voici un script qui, compte tenu de la structure que vous avez montrée, convertira toutes les données en ppm et supprimera les colonnes ppb.
Ce n'est qu'un point de départ, et si des détails plus spécifiques modifient les calculs, ils peuvent être inclus dans la logique.
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 )
)
);
Il existe sans aucun doute de nombreuses façons de procéder, voici la première qui vous vient à l'esprit en supposant que le format de colonne dans votre exemple est cohérent. Vous pouvez soit exécuter le script au bas de l'article pour voir un exemple complet, soit suivre les commentaires verts dans le script et les captures d'écran ci-dessous :
Regroupez toutes les données de la station dans une seule colonne à l'aide de Stack :

Formule pour Station (affichée à la fois dans le format « jolie » et dans le code que vous obtenez en double-cliquant sur la formule :

La formule pour l'unité est similaire :

Formule pour les comptes de données pour chaque unité potentielle :

Tabulate s'appuie sur le type de données ordinal ou nominal pour les intervalles et la station :

Utilisez ensuite la table Make Into Data dans le menu de tabulation.
Script pour recréer un exemple :
//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;
Salut Jim,
J'ai posté une photo de ce à quoi ressemblent les données, en réponse à votre question.S'il vous plaît dites-moi les étapes pour modifier les données en place.
Merci.
Salut,
Voici à quoi ressemblent les données.Le nom de la colonne indique la station et les unités de mesure.
Merci gentiment pour l'aide.
Les données apparaissent-elles sous forme numérique (sans les unités - ou unités dans un champ séparé) ou sous forme de caractères où les unités apparaissent avec le nombre (par exemple, 13 ppm) ?Ce serait plus simple si vous pouviez fournir un exemple de la façon dont les données apparaissent.Une formule doit effectuer la conversion souhaitée, mais la formule exacte dépend de l'apparence des données.
Un script très simple peut être utilisé pour modifier les valeurs directement dans la colonne dans laquelle elles sont entrées.Ou vous pouvez utiliser l'outil Recode pour faire de même, dans un format interactif.Comment déterminer quelles sont les unités de mesure ?Y a-t-il une colonne séparée qui l'indique ?