文字列の Col Min() & Col Max()グループ変数を許可するなど、Col Min()/Col Max() と同様に動作する関数に興味があります。ただし、数値列を操作する代わりに、文字列を操作します。 例えば:
- "Col Min Str( :Data, :Grouping)" は、:Data からアルファベット順で最初のエントリを :Grouping でグループ化して返します。
- "Col Max Str(:Data, :Grouping)" は、:Data からアルファベット順で最後のエントリを :Grouping でグループ化して返します。
アイデア?
Re: 文字列の Col Min() & Col Max()両方の返信者 - ありがとう - この解決策を検証して返信します
質問は、〜70k行で動作できるかどうかと、どれくらいの期間ですか?
ところで、私はAWSインスタンスで非常に強力な(RAM、SSD)マシンを使用しています...
Re: 文字列の Col Min() & Col Max()これは、数学の私のお気に入りの特性の 1 つを使用する別のソリューションです。
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>
それが機能する方法はすべてランクに基づいています。
リストのランクは、元のリストをサブセット化して順序付きリストを取得するために必要な順序を示します。
l = {"B", "D", "C", "A"};
r = rank(l);
// r = [4, 1, 3, 2]
// l[r] = {"A", "B", "C", "D"}
クールな考えは、rank() の rank() をタンクすると、ソートされたリストに添字を付けるために使用されたときに、元のリストに戻すために必要な順序が得られるということです。
rr = rank(r);
// rr = [2, 4, 3, 1]
// l[r][rr] = {"B", "D", "C", "A"}
これがうまくいくことを願っています。
Re: 文字列の Col Min() & Col Max()Col Max Str() 関数は汎用です。どんな文字データが渡されても機能します。以下は、サンプルデータテーブルでの使用法です
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()ジム、
このjslをより一般的にすることはできますか?
たとえば、下の表の場合
なぜを試す
1A
2C
二次元
B 3B
B 2F
C 1S
C 1W
C 1R
Try ie あたりの「Why」の最大値を取得したい
二次元
B 3B
C 1W
Re: 文字列の Col Min() & Col Max()@ジョン_マッデン、あなたの返信により、私の Eval(Parse()) メソッドの使用について始めました。これは強力ですが、紛らわしい方法です。そこでもう一度コードを見て、As Column() 関数を使用することで 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()Eval(Parse()) 方法論を使用すると、単純に JSL ステートメントをリテラル文字列に構築して実行することができます。これは、JMP がステートメントを適切に解釈しない場合に使用します。問題のステートメントを最初にこの形式で試しました
rr = dt << get rows where( Column( dt, by ) == testBy );
JMP はこれを気に入らなかった...というか、JMP はこれを私が思っていたように解釈しませんでした。明示的な形式である場合、ステートメントは機能しました
rr = dt << get rows where( :sex == "F" );
したがって、その特定の行をリテラル文字列として生成し、Eval(Parse()) 結合関数を使用することで、必要なコードの正確な明示的な形式を生成して実行します
Eval(Parse(
"rr = dt << get rows where( :" || by || " == \!"" || testBy ||"\!" );"
)
);
Re: 文字列の Col Min() & Col Max()ジム、
ありがとう、これはうまくいくようです。 それは私の問題を解決します。
しかし、あなたはについて少し言うことができますかどうやってできます? 面白そうに見えますが、スタイル、特に Eval ( Parse … ) 句が何をしているのかについては詳しくありません。
乾杯、ジョン
Re: 文字列の Col Min() & Col Max()これはあなたが望むものを提供すると思います
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" );
)
);