Col Min () y Col Max () para columnas de caracteresMe interesa una función que se comporte de manera análoga a cómo lo hace Col Min () / Col Max (), lo que incluye permitir agrupar variables; pero en lugar de operar en columnas numéricas, operaría en columnas de caracteres. Por ejemplo:
- "Col Min Str (: Data,: Grouping)" devolvería la primera entrada alfabéticamente de: Data, agrupada por: Grouping.
- "Col Max Str (: Data,: Grouping)" devolvería alfabéticamente la última entrada de: Data, agrupada por: Grouping.
Ideas?
Re: Col Min () & Col Max () para columnas de caracteres @John Madden , su respuesta me permitió comenzar a utilizar el método Eval (Parse ()). Es una metodología poderosa pero confusa. Así que volví a echar un vistazo al código y, al usar una función As Column (), se puede eliminar todo el asunto Eval (Parse ())
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 () para columnas de caracteresEl uso de la metodología Eval (Parse ()), simplemente le permite a uno construir una (s) declaración (es) JSL en una cadena literal, y luego ejecutarlas. Utilizo esto en ocasiones cuando JMP no interpreta una declaración correctamente. Inicialmente probé la declaración en cuestión de esta forma.
rr = dt << get rows where( Column( dt, by ) == testBy );
A JMP no le gustó esto ... o mejor dicho, JMP no interpretó esto como pensé que lo haría. La declaración funcionó si estaba en una forma explícita
rr = dt << get rows where( :sex == "F" );
Por lo tanto, al generar esa línea específica como una cadena literal y usar la función combinada Eval (Parse ()), genera la forma explícita exacta del código que quiero y luego la ejecuta.
Eval(Parse(
"rr = dt << get rows where( :" || by || " == \!"" || testBy ||"\!" );"
)
);
Re: Col Min () & Col Max () para columnas de caracteresJim
Gracias, esto parece funcionar bien. Resuelve mi problema.
Pero ¿puedes decir algo sobre cómo ¿funciona? Parece interesante, y no estoy familiarizado con el estilo, en particular lo que está haciendo la cláusula Eval (Parse ...).
Saludos john
Re: Col Min () & Col Max () para columnas de caracteresCreo que esto proporciona lo que quieres.
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" );
)
);Re: Col Min () & Col Max () para columnas de caracteresJim
¿Puede ser este jsl más genérico?
por ejemplo para la tabla de abajo
Prueba porque
A 1A
A 2C
Un 2D
B 3B
B 2F
C 1S
C 1W
C 1R
Quiero obtener el máximo de "Por qué" por prueba, es decir
Un 2D
B 3B
C 1W
Re: Col Min () & Col Max () para columnas de caracteresLa función Col Max Str () es genérica. Funciona en cualquier dato de carácter que se le pase. A continuación se muestra su uso en la tabla de datos de muestra.
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 () para columnas de caracteresAquí hay otra solución que usa una de mis propiedades favoritas de matemáticas.
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 forma en que funciona está basada en el rango.
El rango de una lista dará el orden requerido para subcontratar la lista original para obtener una lista ordenada.
l = {"B", "D", "C", "A"};
r = rank(l);
// r = [4, 1, 3, 2]
// l[r] = {"A", "B", "C", "D"}
Lo interesante es que si obtiene un rango () de un rango () le dará el orden requerido para volver a la lista original cuando se usa para subscribir la lista ordenada.
rr = rank(r);
// rr = [2, 4, 3, 1]
// l[r][rr] = {"B", "D", "C", "A"}
Espero que esto funcione.
Re: Col Min () & Col Max () para columnas de caracteresAmbas respuestas, gracias. Validaré esta solución y le responderé.
La pregunta es si puede funcionar en ~ 70k filas y ¿cuánto tiempo?
Por cierto, estoy usando una máquina muy, muy fuerte (RAM, SSD) en la instancia de AWS ...