FormulaでFORループを使用して新しい列を作成する<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />こんにちは皆さん、テーブルで作成されたいくつかの列を、これらの列のいずれかに特定のchar値(「screened」)があるかどうかを説明する新しい列に組み合わせる方法について質問があります。
現在、私のデータセットは、スクリプト内の数式に基づいて「screened」と「unscreened」の文字値を含む「n」個の新しい列を追加するスクリプトで分析されています。
私の目標は、スクリプトに、「n」個の新しい列のそれぞれの値を評価する新しい列を追加する最後のステップを含めることです。各行について、それらの列のいずれかが「スクリーニング」された場合、その行にスクリーニング済みのラベルが付けられます。 。
新しい列の数が常に同じである場合は、長めのIfステートメントを記述して、各列の値を確認します。 ただし、「n」列の数を確認するためにスクリプトを作成する必要があります。 フォーラム内でFORループを使用することを考えました。たとえば、次のようになります。
dt << New Column( "All_screens"、character、nominal、setformula(
If(For(i = 1、i <= N Items(個別のScreenColumns )、individualScreenColumns == "Screened")、--->スクリーニング列のいずれかにscreenが含まれている場合、---> "Screened"、"Unscreened"などの魔法が必要です)。 );
しかし、FORループは値を返さないため、この魔法を理解することはできませんでした。 誰か考えがありますか?
ありがとう、
- 桃
Re:数式でFORループを使用して新しい列を作成する列式の不明な数の列にわたる行単位の操作の実装は、それほど単純ではありません(ただし、魔法は必要ありません)。
以下は、ローカル変数を利用するいくつかのアイデアです。
//単なるサンプルテーブル
n = 5 ;
nr = 10 ;でも
dt =新しいテーブル(( 「上映概要」 、行を追加(( nr )。 、複数の列を追加する(( "バツ" 、 n 、キャラクター)) ;
為に((私= 1 、私<= n 、私++、
桁(( dt 、私)。 <<各値を設定する({ 「上映」 、 「非公開」 } [ 1 + ((ランダム整数(( 1 、 nr )。 >> 1 )])
)。 ;
//列に「screened」が含まれているかどうかを示す新しい列
dt <<新しい列(( 「上映」 、
キャラクター、
方式((
ローカル({私= 0 、 n = N列((現在のデータテーブル()) - 1 } 、
もしも((含まれています((繰り返す({私++ ;桁((私)[]} 、 n )。 、 「上映」 )。 、
「上映」
)。
)。
)。
)。 ;
//同じですが、For()ループがあります。きちんとしたコードではありませんが、大きなnの場合はRepeat()よりもおそらく効率的です
//中間リストが作成されていないため
dt <<新しい列(( 「上映2」 、
キャラクター、
方式((
ローカル({私、 n = N列((現在のデータテーブル()) - 2 、 s = "" } 、
為に((私= 1 、私<= n 、私++、
もしも((桁((私)[] == 「上映」 、
s = 「上映」 ;
壊す() ;
)。
)。 ;
s ;
)。
)。
)。 ;
//または、「screened」のnrを返します
dt <<新しい列(( 「上映された数」 、
数値、
方式((ローカル({私= 0 、 n = N列((現在のデータテーブル()) - 3 } 、和((繰り返す({私++ ;桁((私)[] == 「上映」 } 、 n ))))) )。 ;
Re:数式でFORループを使用して新しい列を作成するジムに感謝します。列の数がわからないので、forループを使用して方程式をexpr()に入れてから、これをforループで生成された式のeval()を含むifステートメントに移動します。 。
Re:数式でFORループを使用して新しい列を作成する私はあなたが話している問題を解決するためにブーリアンの総和を使用します。a、b、c、dの4つの列がある場合、次の式を使用しました。
If(sum(a == "screened"、b == "screened"、c == "screened"、d == "screened")> 0、 "screened"、 "")