Sélectionnez où basé sur plusieurs colonnes<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Je ne sais pas s'il existe un bon moyen de faire ce que j'espère, mais j'ai la situation suivante:
J'ai un fichier de données qui est le résultat de la collecte de mesures toutes les secondes. Il y a une colonne d'horodatage, une colonne d'état, puis toutes mes colonnes de données.
Il y a trois entrées différentes possibles dans la colonne d'état, "RAMP", "WAIT" et "READ". Le classement général des données par heure donne environ 20 lignes de "RAMP" suivies de 85 lignes de "WAIT" suivies de 9 lignes de "READ", qui se répète ensuite une douzaine de fois. Mes régions d’intérêt, que je voudrais sélectionner, sont les 30 dernières lignes de chaque section intitulées "WAIT".
Évidemment, il est extrêmement simple de sélectionner toutes les lignes "WAIT", ou les 30 dernières lignes du fichier entier, mais je ne vois pas comment sélectionner uniquement les 30 dernières de chaque section.
Y a-t-il un bon moyen de résoudre ce problème?
Re: Sélectionnez où basé sur plusieurs colonnesComment obtenir le nom de la table et le nombre d'éléments de la liste:
dt = datatable actuel () ;
nom_dt = dt << obtenir un nom ;
lst = { "une" , "b" , "c" } ;
nitems ( lst ) ;
Utilisez || concaténer une chaîne avec un autre:
"chaîne" || ( dt << obtenir un nom )
Re: Sélectionnez où basé sur plusieurs colonnesUne autre fonction que je * sais * doit exister mais que je ne trouve pas - Table de données courante () renvoie une référence que je peux affecter à dt, mais je cherche un moyen d'extraire le nom de la table - j'ai un script Je voudrais exécuter sur plusieurs tables différentes, et je veux le démarrer sur la table actuelle, puis créer un nouveau tableau de sous-ensemble nommé " ". Je m'attendais à ce que le nom de la table de sortie ("chaîne" dt) ou ("chaîne" $ dt) fonctionne, quelque chose comme ça, mais ce n'est pas le cas. Je suis à la recherche de documentation, mais je pensais jeter ce commentaire au cas où.
Re: Sélectionnez où basé sur plusieurs colonnesJ'ai trouvé un moyen de faire la liste que je voulais - j'ai ajouté:
last_30_waits = {};
pour (j = 1, j <= 3, j ++,
pour (i = 0, i <= 3, i ++,
insertinto (last_30_waits, (wait_end_list- je))));
dt << Sélectionnez les lignes (last_30_waits);
Mais j'ai le sentiment que ce n'est pas optimal. De même, existe-t-il une fonction qui renvoie le nombre d'entrées dans une liste? Je voudrais remplacer le "3" dans ma première boucle for avec cette fonction, mais j'ai du mal à le trouver.
Re: Sélectionnez où basé sur plusieurs colonnesMerci, cela me rapproche beaucoup, mais j’ai une dernière question sans réponse - quel est le meilleur moyen de tout sélectionner * entre * chaque paire de numéros wait_start_list / wait_end_list? Je n'ai pas travaillé avec des listes avant. (Je suis vraiment nouveau dans le domaine des scripts en général, mais j'essaie d'apprendre le mieux possible.)
Re: Sélectionnez où basé sur plusieurs colonnesVoici une façon de le faire. Vous recherchez toutes les lignes WAIT, puis parcourez les numéros de lignes. Lorsqu'il y a un écart supérieur à 1, vous avez trouvé la fin d'une section. Le code ci-dessous construit deux listes qui identifient les numéros de ligne de début et de fin pour chaque section. J'ai créé une petite table pour cet exemple; changer la noyer paramètre à 30 pour vos données.
dt = Nouvelle table ( "temp" ,
Ajouter des lignes ( 39 ) ,
Nouvelle colonne ( "Statut" ,
Personnage ,
Nominal ,
Définir des valeurs (
{ "RAMPE" , "RAMPE" , "RAMPE" , "ATTENDRE" , "ATTENDRE" , "ATTENDRE" , "ATTENDRE" , "ATTENDRE" , "LIS" ,
"LIS" , "LIS" , "LIS" , "LIS" , "RAMPE" , "RAMPE" , "RAMPE" , "ATTENDRE" , "ATTENDRE" ,
"ATTENDRE" , "ATTENDRE" , "ATTENDRE" , "LIS" , "LIS" , "LIS" , "LIS" , "LIS" , "RAMPE" ,
"RAMPE" , "RAMPE" , "ATTENDRE" , "ATTENDRE" , "ATTENDRE" , "ATTENDRE" , "ATTENDRE" , "LIS" , "LIS" ,
"LIS" , "LIS" , "LIS" }
)
) ,
) ;
wait_rows = dt << obtenir des rangées où ( : Statut == "ATTENDRE" ) ;
nr = maintenant ( wait_rows ) ;
wait_start_list = {} ;
wait_end_list = {} ;
old_row = wait_rows [ 1 ] - 1 ;
// Nombre de lignes WAIT à obtenir
noyer = 4 ;
// Cela va obtenir les 4 dernières lignes WAIT. Remplacer par 30 pour obtenir les 30 dernières lignes WAIT
pour ( je = 1 , je <= nr , je ++,
new_row = wait_rows [ je ] ;
// Rechercher un écart supérieur à un dans la liste des lignes
si (( new_row - old_row ) > 1 ,
insérer dans ( wait_start_list , ( old_row - noyer + 1 )) ;
insérer dans ( wait_end_list , old_row ) ;
) ;
old_row = new_row ;
) ;
// S'occupe de la dernière série de WAITs
old_row = wait_rows [ nr ] ;
insérer dans ( wait_start_list , ( old_row - noyer + 1 )) ;
insérer dans ( wait_end_list , old_row ) ;
Re: Sélectionnez où basé sur plusieurs colonnesMalheureusement, je ne suis actuellement que JMP, pas de SAS de base - mais merci pour cette suggestion.
Re: Sélectionnez où basé sur plusieurs colonnesVous avez posté ceci sur le forum JMP, je ne suis donc pas sûr que cela aide ou non. En utilisant la base SAS, c'est un programme relativement court si vous utilisez les bons outils:
data last_30_waits;
group_num + 1;
n_waits = 0;
do Until (last.status and status = 'WAIT');
définir les mesures (keep = status);
par statut non trié;
si status = 'WAIT' alors n_waits + 1;
fin;
** À ce stade, numéro_groupe identifie un ensemble de WAIT et n_waits indique le nombre d'enregistrements contenus dans le groupe;
n_found = 0;
do Until (last.status and status = 'WAIT');
définir les mesures;
par statut non trié;
Si status = 'WAIT', alors faites;
n_found + 1;
si n_found> = n_waits - 29 alors sortie;
fin;
fin;
drop n_found;
courir;
Bonne chance.