Re: Operaciones arbitrarias (funciones, etc.) en cada elemento de una listaSi su caso es así, entonces posiblemente podría evitar el bucle al menos para la transformación usando Parse() (aunque podría ser más rápido recorrer la cadena).
Names Default To Here(1);<BR />str = "120, 130, 160, 120, 300, 200";
numList = Parse("{" || str ||"}");
Show(numList[1], numList[2]);Como tabla de datos:
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(12),
Compress File When Saved(1),
New Column("Column 1",
Character,
"Nominal",
Set Values(
{"120, 130, 160, 120, 300, 200", "120, 130, 160, 120, 300, 200",
"120, 130, 160, 120, 300, 200", "120, 130, 160, 120, 300, 200",
"120, 130, 160, 120, 300, 200", "120, 130, 160, 120, 300, 200",
"120, 130, 160, 120, 300, 200", "120, 130, 160, 120, 300, 200",
"120, 130, 160, 120, 300, 200", "120, 130, 160, 120, 300, 200",
"120, 130, 160, 120, 300, 200", "120, 130, 160, 120, 300, 200"}
)
)
);
dt << New Column("numlist", Expression, << set each value(Parse("{" || :Column 1|| "}")));
numListList = dt:numList << get as matrix;
Show(numListList, numListList[1], numListList[1][1]);Re: Operaciones arbitrarias (funciones, etc.) en cada elemento de una lista¡Gracias chicos!
esto es genial
De hecho, encontré JMP16 en nuestra intranet, el Departamento de TI dijo que estaban en el proceso de preparar las instrucciones de instalación y lanzarlo oficialmente. Así que seguí adelante y lo instalé de todos modos.
Mi(s) tarea(s) real(es) era(n) un poco más complicada(s), como ejemplo, en un caso tenía una lista de cadenas de tipo
"120, 130, 160, 120, 300, 200"
Los datos reales serían una columna con cada fila con ese tipo de cadena (solo mucho más larga)
Necesitaba convertir eso en una lista de listas de números. Así que necesitaba leer esa columna en una lista inicial y luego aplicar Words() en esta lista inicial para obtener una lista de cadenas y luego Num() para convertir cada cadena en un número. Esto significa dos bucles anidados.
Por ahora lo he hecho con dos bucles For Each, pero déjame ver las sugerencias que publicaste aquí. Nunca pude comprender Expr() - Supongo que necesito darle otra oportunidad.
¡Gracias!
Re: Operaciones arbitrarias (funciones, etc.) en cada elemento de una lista@miguello ,
@jthi le dio excelentes respuestas (Felicitaciones).Yo también estaba muy emocionado por la función TransformEach de JMP 16.
A continuación se muestra una parte modificada de un script escrito para versiones anteriores de JMP y publicado para JMP13. Muchos de mis antiguos colegas utilizaron la función LFUNC (el nombre es la abreviatura de función de lista).El nombre JMP 16 "TransformEach" y la sintaxis son muy buenos. Sin embargo, si alguno de los elementos de la lista es del tipo incorrecto para la transformación especificada, solo se devuelve un error... una función Try() puede solucionarlo.
Entonces, en caso de que esto pueda ser de alguna utilidad hasta que llegue a JMP 16, lo estoy publicando.Simplemente guarde la parte del código de definición de la función en un archivo y use Incluir() en cualquier secuencia de comandos que lo necesite.
// JSL Companion: Applications of the JMP Scripting Language
// Title: JSLC_CustomListFunctions.jsl
// Version: Windows JMP® 13.2.0
// Purpose: Provides examples of writing user functions.
/*Notes:
These functions are provided for learning as well as utility.
See Chapter 5 and 5_Extra_CustomListFunctions.jsl");
The script will define 2 functions. After each is a comment
block /*: Usage & Test examples ... --- end Test*/. Remove
The comment block and run the examples one line at a time. Open
the embedded log or have the log window visible to see
the results.
Motivation:
As seen in Chapter 5, a numeric function on a single layer
list of numbers, or a vector, or a matrix, will return the
same object with the function applied to each item. For example,
xx = Sqrt({1,2,3,4,9}); //xx = {1, 1.4142135623731, 1.73205080756888, 2, 3}
We have suggested that the same apply to String functions (that operate
on a single item) on a list of text. What we would like is
xx = Substr({"Quaker", "Minnesota", "Nebraska"}, 1,1); would return
xx = {"Q", "M", "N"}. However, currently most JMP String functions do not
allow list agruments.
Functions defined here, are:
- LFunc( mylist, expr); where expression is like expr(Substr(x,1,1)).
{LIKE function notes removed}
LFunc can save writing for-loops, Like save looking up the REGEX syntax.
*/
//------LFunc-------------------------------------------------------------------
Lfunc = Function( {xList, fExpr/*ex. Expr(Contains(x,"h"))*/},
{x = {}, i = 1, errCode = 0, errStr = "\!NError bad argument", newExpr},
If( !Is List( xList ),
errCode = 1
);
If(
Type( Name Expr( fExpr ) ) == "Name",
//if Name then JMP does not recognize the function
tmp = Trim( Char( Name Expr( fExpr ) ) );
//extract the function and check if it is contained in the global namespace, if not error!
If( Namespace( "global" ) << Contains( Word( 1, tmp, ":(" ) ) == 0,
errCode = errCode + 2
);,
Type( Name Expr( fExpr ) ) != "Expression", errCode = errCode + 2
);
//catches typos, returns Name if not a valid function
//catches typos, returns Name if not a valid function
If( !Is Expr( Name Expr( fExpr ) ),
errCode = errCode + 2
); //catches syntax
If(
!errCode,
For( i = 1, i <= N Items( xList ), i++,
newExpr = Substitute( Name Expr( fExpr ), Expr( x ), xList[i] );
Insert Into( x, Try( newExpr, Empty() ) );
),
errCode == 1, Write( errStr || "(1) not a list \!N" ),
errCode == 2, Write( errStr || "(2) not a valid expression \!N" ),
errCode == 3, Write( errStr || "s (1) is not a list and (2) is not a valid expression \!N" )
);
x//return x
;
); //End Lfunc
//------------------------------------------------------------------------------
//Usage & Test ...remove the slash asterisk and run in segments, results are in the log
//------------------------------------------------------------------------------
myList1={"john", "harry", "huh","ah ha", "xyx", , "a", "h", 7, [1,7]};
/* example below returns a list of numeric values, one value for each item in the list
n =>1st location of h, 0 => does not contain "h", Empty() => the item is not
a valid argument for that expression.
*/
zz1 = Lfunc(myList1,Expr(Contains(x,"h")));
show(zz1);
myList2={"john", "harry", "huh","ah ha", "xyx", , "a", "h"};
zz2=Lfunc(myList2, Expr(Uppercase(x)));
show(zz2);
//-----------------------------------------------------------------------------------------
/* returns a list of how many words are in each string
[] -> no occurrences
Empty() => the expression is not valid for that item.
*/
zz3 = Lfunc(mylist2, expr(nitems(words(x))));
show(zz3);
//-----------------------------------------------------------------------------------------
/* This specified function requires numeric arguments
Empty() => the expression is not valid for that item.
A numeric function applied to a matrix returns a matrix
of the results applied on each element in the matrix.
Only the last 2 items are valid arguments for Log()
*/
zz4 = Lfunc(mylist1, expr(log(x)));
show(zz4);
//----------------Error Checking---------------------------------------------------------------
/* Uncomment the code below to show the error capture and reporting */
//zz = Lfunc("oh johhny", Expr(Contains(x,"h")) ); //not a list
//zz = Lfunc({"oh johhny"}, Expr(Contians(x,"h")) ); //type not a valid expr due to typo
//zz = Lfunc("oh johhny", Expr(Contians(x,"h")) ); //not a list and not a valid expr
Re: Operaciones arbitrarias (funciones, etc.) en cada elemento de una listaComo ya ha notado, JMP16 ayudará con esto con For Each y Transform Each. Si tiene que hacer esto muchas veces, ¿tal vez podría crear funciones personalizadas para realizar las tareas?
Names Default To Here(1);
charToNum = function({tempList}, {Default Local},
newList = {};
For(i = 1, i <= N Items(tempList), i++,
newList[i] = Num(tempList[i]);
);
return(newList);
);
a = {"1", "2"};
b = charToNum(a);
show(b);
Editar:
También puede crear una función más complicada que podría manejar diferentes transformaciones. Lo más probable es que sea excesivo y realmente no lo recomendaría (simplemente crearía diferentes funciones para diferentes transformaciones).
Aquí hay un ejemplo de cómo se podría hacer:
Names Default To Here(1);
transformList = function({tempList, transformExpression}, {Default Local},
newList = {};
For(i = 1, i <= N Items(tempList), i++,
val = tempList[i];
newList[i] = transformExpression
);
return(newList);
);
a = {"1", "2", "100"};
b = transformList(a, Expr(Num(val)));
c = transformList(b, Expr(Multiply(val, 10)));
d = transformList(c, Expr(Char(val)));
Show(a,b,c,d);
//can also use custom functions with transformList
padZero = function({tempValue}, {Default Local},
if(Length(tempValue) < 2,
tempValue = "0" || tempValue;
);
return(tempValue)
);
e = transformList(a, Expr(padZero(val)));
Show(e);
f = transformList(e, Expr(Length(val)));
Show(f);
Operaciones arbitrarias (funciones, etc.) en cada elemento de una lista¿Existe una forma más sencilla de aplicar la misma función en cada elemento de una lista en lugar de iterar a través de una lista?
Por ejemplo:
stringlist = {"1", "2"};
numericlist = {};
for (i = 1, i<=N Items(stringlist), i++,
numericlist[i] = Num(stringlist[i])
);
show(numericlist);¿Hay algo más simple, algo como simplemente decir:
numericlist = Num(stringlist);
pero esto obviamente no funciona. ¿Cualquier otra forma?
PD Acabo de encontrar For Each función nueva en JMP 16, desafortunadamente, todavía estoy en JMP 15
Investigación del Consumidor y del MercadoDiseño de experimentosIngeniería de Calidad y Procesos