Col Min() & Col Max() pour les colonnes de caractèresJe suis intéressé par une fonction qui se comporterait de manière analogue à la façon dont Col Min()/Col Max() le fait, notamment en autorisant le regroupement de variables ; mais au lieu de fonctionner sur des colonnes numériques, il fonctionnerait sur des colonnes de caractères. Par exemple:
- "Col Min Str( :Data, :Grouping)" renvoie la première entrée alphabétique de :Data, groupée par :Grouping.
- "Col Max Str(:Data, :Grouping)" renvoie la dernière entrée alphabétique de :Data, groupée par :Grouping.
Des idées ?
Re : Col Min() & Col Max() pour les colonnes de caractèresLes deux répondeurs - merci - je validerai cette solution et vous répondrai
La question est de savoir si cela peut fonctionner sur ~ 70k lignes et combien de temps?
BTW, j'utilise une machine très, très puissante (RAM, SSD) sur une instance AWS ...
Re : Col Min() & Col Max() pour les colonnes de caractèresVoici une autre solution qui utilise l'une de mes propriétés préférées des mathématiques.
Names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
l = :name << Get Values;
r = rank(l);
rr = rank(r);
dt << new Column("Order", <<SET values=""></SET>
La façon dont cela fonctionne est entièrement basée sur le rang.
Le rang d'une liste donnera l'ordre requis pour sous-ensembler la liste d'origine afin d'obtenir une liste ordonnée.
l = {"B", "D", "C", "A"};
r = rank(l);
// r = [4, 1, 3, 2]
// l[r] = {"A", "B", "C", "D"}
La pensée cool est que si vous tankez un rang () d'un rang (), il vous donnera l'ordre requis pour le ramener à la liste d'origine lorsqu'il est utilisé pour indicer la liste triée.
rr = rank(r);
// rr = [2, 4, 3, 1]
// l[r][rr] = {"B", "D", "C", "A"}
J'espère que cela fonctionne.
Re : Col Min() & Col Max() pour les colonnes de caractèresLa fonction Col Max Str() est générique.Il fonctionne sur toutes les données de caractère qui lui sont transmises.Vous trouverez ci-dessous son utilisation sur votre exemple de tableau de données
names default to here(1);
dt=New Table( "Untitled 2",
Add Rows( 8 ),
New Column( "Try",
Character,
"Nominal",
Set Values( {"A", "A", "A", "B", "B", "C", "C", "C"} )
),
New Column( "Why",
Character,
"Nominal",
Set Values( {"1A", "2C", "2D", "3B", "2F", "1S", "1W", "1R"} )
)
);
dt << New Column( "Max Why by Try",
Character,
Nominal,
Formula(
Col Max Str = Function( {data, by},
dt = Current Data Table();
testBy = Column( dt, by )[Row()];
rr = dt << get rows where( as column(dt, by) == testBy );
myList = As List( Column( dt, data )[rr] );
myList = Sort List( myList );
myList[N Items( myList )];
);
result = Col Max Str( "Why", "try" );
)
);Re : Col Min() & Col Max() pour les colonnes de caractèresJim,
Ce jsl peut-il être plus générique?
par exemple pour le tableau ci-dessous
Essayez pourquoi
Un 1A
Un 2C
Un 2D
B 3B
B 2F
C 1S
C 1W
C 1R
Je veux obtenir le maximum de "Pourquoi" par essai, c'est-à-dire
Un 2D
B 3B
C 1W
Re : Col Min() & Col Max() pour les colonnes de caractères@john_madden , votre réponse m'a initié à mon utilisation de la méthode Eval(Parse()).C'est une méthodologie puissante mais déroutante.J'ai donc jeté un coup d'œil au code une fois de plus, et en utilisant une fonction As Column(), toute la chose Eval(Parse()) peut être supprimée
names default to here(1);
dt=open("$SAMPLE_DATA/big class.jmp");
dt << New Column( "Max Name by Sex",
Character,
Nominal,
Formula(
Col Max Str = Function( {data, by},
dt = Current Data Table();
testBy = Column( dt, by )[Row()];
rr = dt << get rows where( as column(dt, by) == testBy );
myList = As List( Column( dt, data )[rr] );
myList = Sort List( myList );
myList[N Items( myList )];
);
result = Col Max Str( "Name", "Sex" );
)
);Re : Col Min() & Col Max() pour les colonnes de caractèresL'utilisation de la méthodologie Eval(Parse()) permet simplement de créer une ou plusieurs instructions JSL dans une chaîne littérale, puis de les exécuter.Je l'utilise parfois lorsque JMP n'interprète pas correctement une instruction.J'ai d'abord essayé la déclaration en question sous cette forme
rr = dt << get rows where( Column( dt, by ) == testBy );
JMP n'a pas aimé cela... ou plutôt, JMP n'a pas interprété cela comme je le pensais.La déclaration a fonctionné si elle était sous une forme explicite
rr = dt << get rows where( :sex == "F" );
Par conséquent, en générant cette ligne spécifique sous forme de chaîne littérale et en utilisant la fonction combinée Eval(Parse()), elle génère la forme explicite exacte du code que je veux, puis l'exécute
Eval(Parse(
"rr = dt << get rows where( :" || by || " == \!"" || testBy ||"\!" );"
)
);
Re : Col Min() & Col Max() pour les colonnes de caractèresJim,
Merci, cela semble fonctionner correctement. Cela résout mon problème.
Mais pouvez-vous en dire un peu plus sur comment Ça marche? Cela semble intéressant, et je ne suis pas familier avec le style, en particulier ce que fait la clause Eval ( Parse … ).
Bravo, John
Re : Col Min() & Col Max() pour les colonnes de caractèresJe pense que cela fournit ce que vous voulez
names default to here(1);
dt=open("$SAMPLE_DATA/big class.jmp");
dt << New Column( "Max Name by Sex",
Character,
Nominal,
Formula(
Col Max Str = Function( {data, by},
dt = Current Data Table();
testBy = Column( dt, by )[Row()];
Eval(
Parse(
"rr = dt << get rows where( :" || by || " == \!"" || testBy ||
"\!" );"
)
);
myList = As List( Column( dt, data )[rr] );
myList = Sort List( myList );
myList[N Items( myList )];
);
result = Col Max Str( "Name", "Sex" );
)
);
dt << New Column( "Min Name by Sex",
Character,
"Nominal",
Formula(
Col Min Str = Function( {data, by},
dt = Current Data Table();
testBy = Column( dt, by )[Row()];
Eval(
Parse(
"rr = dt << get rows where( :" || by || " == \!"" || testBy ||
"\!" );"
)
);
myList = As List( Column( dt, data )[rr] );
myList = Sort List( myList );
myList[1];
);
result = Col Min Str( "Name", "Sex" );
)
);