Re: リスト内の各項目に対する任意の操作 (関数など)あなたのケースがそのようなものである場合、Parse() を使用して、少なくとも変換のループを回避できる可能性があります (ただし、文字列をループする方が速い場合があります)。
Names Default To Here(1);<BR />str = "120, 130, 160, 120, 300, 200";
numList = Parse("{" || str ||"}");
Show(numList[1], numList[2]);データ テーブルとして:
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: リスト内の各項目に対する任意の操作 (関数など)みんなありがとう!
これは素晴らしいです。
私は実際にイントラネットで JMP16 を見つけました。IT 部門は、インストール手順を準備し、正式にリリースする過程にあると述べました。 だから私は先に進み、とにかくそれをインストールしました。
私の実際のタスクはもう少し複雑でした。例として、あるインスタンスでは、タイプの文字列のリストがありました
"120, 130, 160, 120, 300, 200"
実際のデータは、各行がそのタイプの文字列を持つ列になります (はるかに長いだけです)
それを数字のリストのリストに変える必要がありました。 そのため、その列を初期リストに読み込み、この初期リストに Words() を適用して文字列のリストのリストを取得し、次に Num() を適用して各文字列を数値にする必要がありました。 これは、2 つのネストされたループを意味します。
今のところ、2 つの For Each ループでそれを実行しましたが、ここに投稿された提案を見てみましょう。 私は Expr() を理解できませんでした-もう一度チャンスを与える必要があると思います。
ありがとう!
Re: リスト内の各項目に対する任意の操作 (関数など)@ミゲロ、
@jthi素晴らしい回答をくれました (Kudos)。私も、JMP 16 の関数 TransformEach にとても興奮していました。
以下は、以前のバージョンの JMP 用に作成され、JMP13 用に公開されたスクリプトの一部を変更したものです。 私の元同僚の多くは、LFUNC 関数 (名前はリスト関数の略) を使用していました。JMP 16 の名前「TransformEach」と構文は非常に優れています。 ただし、リスト項目のいずれかが指定された変換に対して正しくない型である場合は、エラーが返されます... Try() 関数でそれを修正できます。
念のため、JMP 16 に到達するまでこれが役立つかもしれないので、投稿します。コードの関数定義部分をファイルに保存し、必要なスクリプトで Include() を使用するだけです。
// 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: リスト内の各項目に対する任意の操作 (関数など)既にお気づきのように、JMP16 は For Each と Transform Each でこの問題を解決します。 これを何度も行う必要がある場合は、タスクを実行するためのカスタム関数を作成できますか?
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);
編集:
さまざまな変換を処理できる、より複雑な関数を作成することもできます。 ほとんどの場合、やり過ぎになる可能性が高く、あまりお勧めしません (さまざまな変換に対してさまざまな関数を作成するだけです)。
これを行う方法の一例を次に示します。
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);
リスト内の各項目に対する任意の操作(関数など)リストを反復処理するのではなく、リストの各項目に同じ関数を適用するもっと簡単な方法はありますか?
例えば:
stringlist = {"1", "2"};
numericlist = {};
for (i = 1, i<=N Items(stringlist), i++,
numericlist[i] = Num(stringlist[i])
);
show(numericlist);もっと簡単な、次のように言うようなものはありますか?
numericlist = Num(stringlist);
しかし、これは明らかに機能しません。 その他の方法で?
PS JMP 16 の新しい For Each 関数を見つけました。残念ながら、私はまだ JMP 15 を使用しています。
消費者および市場調査実験計画法品質およびプロセスエンジニアリング