Utilisez If Then sur Matrix<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Salut les gens,
J'ai des données d'instrument qui présentent périodiquement d'importants changements dans les données en raison du réajustement de l'instrument. J'essaie de créer une nouvelle variable qui effectue ce qui suit: If (data - data [i-1]> 4) ou (data - data [i-1] <-4), alors adj_data = adj_data [i-1], sinon, données = adj_data + (données - données [i-1]); Fondamentalement, si la valeur de données actuelle dépasse la valeur précédente de 4 ou -4, créez une nouvelle valeur ajustée égale à la valeur ajustée précédente. Sinon, ajoutez la différence entre la valeur de données actuelle et précédente à la valeur ajustée.
J'ai compris comment lire les données dans une matrice et supprimer toutes les données manquantes, mais je ne suis pas sûr de savoir comment compléter les calculs décrits ci-dessus sur la matrice. Toutes les suggestions sur la façon d'accomplir ceci seraient appréciées.
Effacer le journal ();
Noms par défaut ici (1);
dt = New Table ("Ajuster les données manquantes",
Ajouter des rangées (24),
Compresser le fichier une fois enregistré (1),
Nouvelle colonne ("Date",
Numérique,
Continu,
Format ("m / j / a", 19),
Format d'entrée ("m / j / y"),
Définir des valeurs (
[3447619200, 3447705600, 3447792000, 3447878400, 3447964800,
3448051200, 3448137600, 3448224000, 3448310400, 3448396800,
3448483200, 3448569600, 3448656000, 3448742400, 3448828800,
3448915200, 3449001600, 3449088000, 3449174400, 3449260800,
3449347200, 3449433600, 3449520000, 3449606400]
)
),
Nouvelle colonne ("Data1",
Numérique,
Continu,
Format ("Meilleur", 12),
Définir des valeurs (
[11, 13, 50, 15,., 17, 18, -20, 20,., 21, 22,., 24, 25, 23,.,.,
.,., 25, 26, 27, 28]
)
),
Nouvelle colonne ("Adj Data1",
Numérique,
Continu,
Format ("Meilleur", 12),
Définir des valeurs (
[0, 2,., 4,., 6, 7,., 9,., 10, 11,., 13, 14, 12,.,.,.,., 14,
15, 16, 17]
)
)
)
// Mettre les données pertinentes dans la matrice
date_time =: Nom ("Date") << Obtenir les valeurs;
data =: Name ("Data1") << Obtenir les valeurs;
// Détermine les lignes n'incluant que des données non manquantes.
row_list = dt << obtenir des lignes où (
Et(
! Est manquant (: Data1),
Contient (data,: Data1),
Contient (data,: Data1) == Contient (date_time, Format (: Date, "mdy"))
)
)
// Convertit row_list, actuellement une matrice [], en une liste {}
Is List (liste_lignes = sous forme de liste (liste_lignes));
date_time = date_time [Loc (! est manquant (données))];
data = data [Loc (! est manquant (data))];
Re: Utilisez si ensuite sur la matriceDésolé Jeff je n'ai pas été plus clair sur ce que j'essaye d'accomplir. J'ai peut-être confondu les choses en parlant à la fois du code JSL et des formules de colonnes.
Le fichier de données joint indique la sortie "souhaitée" dans: adj_data1 et la sortie de la formule de colonne que vous avez fournie dans New Adj Data. Notez que la colonne New Adj Data insère la valeur précédente New Adj Data lorsque: data1 est manquante, même si l'objectif est que New Adj Data affiche les données manquantes lorsque: data1 est manquant.
Afin de créer la colonne: adj_data1, j'essayais d'adapter votre formule de colonne pour que:
- Lorsque: data1 est manquant, la valeur précédente de New Adj Data est placée dans une variable locale et reportée jusqu'à son utilisation à l'étape 2
- Si la valeur actuelle: data1 n'est pas manquante et la valeur précédente: data1 est manquante, New Adj Data est défini sur la liste des valeurs actuelles dans la variable locale.
Je commence à ajouter la valeur New Adj Data à l’étape 1 à une variable locale, puis à récupérer / utiliser cette valeur à l’étape 2.
Je complique peut-être les choses plus que nécessaire, et vous avez un moyen facile de le faire. J'apprécierais certainement toute aide que vous pourriez fournir. Si votre solution n'utilise pas de variable locale dans la formule de colonne, je vous serais également reconnaissant de bien vouloir fournir un exemple simple d'utilisation d'une variable locale telle que celle décrite ci-dessus ou de m'indiquer un ensemble de données JMP existant. utilise des variables locales dans la formule de la colonne. Il semble que pouvoir utiliser avec succès les variables locales dans les formules de colonnes serait très utile. Merci encore.
Re: Utilisez si ensuite sur la matriceAvez-vous des conseils sur la manière de réaliser le code JSL suivant en utilisant des variables locales dans une formule de colonne?
Si vous définissez des variables dans un programme JSL et souhaitez les utiliser dans une formule de colonne, elles doivent être des variables globales. Préfixez les variables avec "::" et vous pourrez les utiliser dans une formule de colonne. Par exemple :: g_one_variable
Re: Utilisez si ensuite sur la matriceSalut Terapin,
J'ai bien peur d'avoir du mal à déchiffrer ce que vous cherchez à faire en fonction du JSL que vous avez envoyé.
La table de données que j'ai jointe ci-dessus traite des valeurs manquantes dans data1 sans nécessiter de variable locale dans la formule. Il vérifie si Data1 est manquant dans la ligne en cours ou la ligne précédente avec! Est manquant (: Data1 - Lag (: Data1,1)). Si l'un ou l'autre manque, la différence sera également absente.
Voici la formule dans la colonne New Adj Data:
Si(
Ligne () == 1, 0,
Abs (: Data1 - Lag (: Data1, 1))> 4 | Est manquant (: Data1 - Lag (: Data1, 1)), Lag (: New Adj Data, 1),
Lag (: New Adj Data, 1) + (: Data1 - Lag (: Data1, 1))
)
Si ce n'est pas ce dont vous avez besoin, pouvez-vous poster un exemple de tableau de données avec une explication précise de ce que vous souhaitez que la valeur de cette nouvelle colonne basée sur une formule soit dans chaque ligne? Cela m'aidera à comprendre exactement ce que vous recherchez.
Merci!
-Jeff
Re: Utilisez si ensuite sur la matriceMerci Jeff pour avoir fourni un exemple de formule de colonne, ainsi que des exemples de matrice. Comme vous pouvez l’imaginer, mon cas est un peu plus compliqué et nécessite que j’ignore les lignes contenant des données manquantes, mais que je reporte la valeur de données ajustée précédemment. Je suis capable d'accomplir cela avec le code JSL suivant, mais je ne peux pas comprendre comment utiliser des variables locales dans une formule de colonne. Avez-vous des conseils sur la manière de réaliser le code JSL suivant en utilisant des variables locales dans une formule de colonne? Merci.
Effacer le journal ();
lag_adj_data = 0;
: adj_data1 [1] = 0;
Pour (i = 2, i <= N lignes (dt1), i ++,
Si (Abs (: data1 -: data1 [i - 1])> 4,
: adj_data1 =: adj_data1 [i - 1],
: adj_data1 =: adj_data1 [i - 1] + (: data1 -: data1 [i - 1])
)
Si (est manquant (: data1 ) &! Est manquant (: adj_data1 [i-1]),
lag_adj_data =: adj_data1 [i-1];
)
Si (est manquant (: data1 [i-1]) &! Est manquant (: data1 ),
: adj_data1 = lag_adj_data
)
)
Re: Utilisez si ensuite sur la matriceComme je l'ai mentionné hier, les formules de colonnes sont généralement très efficaces.
Voir le tableau de données ci-joint. La colonne New Adj Data contient une formule proche de ce que vous recherchez.
C'est encore un petit jeu de données, mais il devrait quand même bien fonctionner avec beaucoup de lignes.
-Jeff
Re: Utilisez si ensuite sur la matriceLes matrices fonctionnent comme des variables normales - appelées plus précisément scalaires - avec la plupart des opérateurs d'arithmétique et de comparaison.
Par exemple:
X = [ 1 , 2 , 3 , 4 ] ;
y = [ 2 , 1 , 2 , 5 ] ;
X > y ;
/ *:
[0, 1, 1, 0]
Comme vous pouvez le voir, j'ai maintenant une matrice qui indique où la matrice y est supérieure à la matrice x.
Mais vous n'êtes pas limité à comparer une matrice à une autre. Vous pouvez également comparer avec un scalaire.
X > 2 ;
/ *:
[0, 0, 1, 1]
Je peux également effectuer des opérations arithmétiques sur l'ensemble de la matrice à la fois.
X - 4 ;
/ *:
[-3, -2, -1, 0]
Vous pouvez indexer dans une matrice pour n’obtenir qu’une partie de la matrice afin de pouvoir facilement comparer une partie de la matrice à une autre.
y [ 2 :: maintenant ( y )] > y [ 1 :: maintenant ( y ) - 1 ] ;
/ *:
[0, 1, 1]
Vous pouvez également utiliser des fonctions sur une matrice.
z = [ 1 , 5 , 1 , - 6 ] ;
abdos ( z [ 2 :: maintenant ( z )] - X [ 1 :: maintenant ( z ) - 1 ]) > 4 ;
/ *:
[0, 0, 1]
En combinant tout cela, vous devriez pouvoir faire ce que vous cherchez avec des matrices.
Cependant, une formule de colonne dans le tableau de données serait plus simple et probablement tout aussi efficace. Je ferai un suivi demain avec un exemple de cela.
-Jeff
Re: Utilisez si ensuite sur la matriceMerci PMroz pour la suggestion. Cela fonctionnera certainement sur les données du tableau, mais le tableau contient environ 500 000 enregistrements et je pensais que les ajustements dans une matrice seraient plus rapides que de traiter directement avec le tableau de données. Avez-vous des suggestions sur la syntaxe d'utilisation des commandes conditionnelles sur une matrice? J'ai consulté les différents "livres" JMP, mais je n'ai rien trouvé qui spécifie clairement la syntaxe. Merci.
Re: Utilisez si ensuite sur la matriceJe pense que cela fera ce que vous voulez. J'opère directement sur votre table, d'ailleurs.
dt = tableau de données ( "Ajuster pour les données manquantes" ) ;
pour ( je = 2 , je <= maintenant ( dt ) , je ++,
di = colonne ( dt , "Data1" ) [ je ] ;
dim1 = colonne ( dt , "Data1" ) [ je - 1 ] ;
adji = colonne ( dt , "Adj Data1" ) [ je ] ;
si ( ! est manquant ( di ) Et ! est manquant ( dim1 ) ,
si ( abdos ( di - dim1 ) > 4 ,
// puis
colonne ( dt , "Adj Data1" ) [ je ] = colonne ( dt , "Adj Data1" ) [ je - 1 ] ;
,
// autre
si ( ! est manquant ( adji ) ,
colonne ( dt , "Data1" ) [ je ] = adji + ( di - dim1 ) ;
) ;
) ;
) ;
) ;