列名を直接呼び出さずに条件付きサブセットテーブルを作成するにはどうすればよいですか?このスクリプトの最初の3行は、高さが60未満の新しいデータテーブルを作成します。この部分は正常に動作します。
開発したい関数については、:heightを使用するのとは異なる方法で列を参照したいと思います。
列を参照するために4つの異なる方法を試しましたが、どれも機能しません。列関数を使用し、列参照関数を取得しました(以下を参照してください)。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//This one works
dtSubgroup = dt << Subset(Rows(dt << get rows where(:height < 60)));
//None of these work
dtSubgroup = dt << Subset(Rows(dt << get rows where(Column("height") < 60)));
dtSubgroup = dt << Subset(Rows(dt << get rows where(Column(dt, "height") < 60)));
dtSubgroup = dt << Subset(Rows(dt << get rows where(Column(4) < 60)));
refList = dt << Get Column Reference( {"height"} );
dtSubgroup = dt << Subset(Rows(dt << get rows where(refList[1] < 60)));それらが機能しない理由はありますか?
ソリューションに関する提案はありますか?
ご協力ありがとうございました。
Re:列名を直接呼び出さずに条件付きサブセットテーブルを作成するにはどうすればよいですか?Column()関数の閉じ括弧の後に空の角括弧を追加してみてください。このような:
Column("height")[] < 60
この変更は役立ちますか?
Re:列名を直接呼び出さずに条件付きサブセットテーブルを作成するにはどうすればよいですか?おかげで、これはまさに私が望んでいたことでした。
なぜこれが機能するのか尋ねてもいいですか?
角かっこを使用せずに列関数を何度も使用しました。
この場合の違いは何ですか?従うべき規則は何ですか?Re:列名を直接呼び出さずに条件付きサブセットテーブルを作成するにはどうすればよいですか?奇妙に思えますよね?
コンテキストがすべてです。たとえば、列式でこれを使用できます。
If( Column("height") < 60, 0, 1 ); // implicit assignment of Row() = current row number
または、For Each Row()関数でそれを使用して、スクリプトで同じことを実行できます。
For Each Row(
// implicit assignment of Row() = current row number
If( Column("height" ) < 60,
:status = "small",
:status = "large"
)
)
列式のコンテキストと上記の繰り返しにより、JMPはRow()関数を暗黙的に設定します。そのため、JMPはその情報を使用して、値を取得または格納する場所(つまり、どの行)を特定します。これは、ここでの一般的なケースのコンテキストではありません。
dtSubgroup = dt << Subset(Rows(dt << get rows where(Column("height") < 60)));
データテーブルは、比較を評価するときに現在の行番号を暗黙的に使用しません。空の添え字演算子[]を追加することで強制します。