各行の値を数えるリストに列1〜6のスクリプトがあります
PORという単語が何回出現し、testという単語が何回出現するかをカウントするJSLスクリプトを作成しようとしています。
以下の例(最後の2列を手動で実行しました)

フォーラムを読んで、DTをマトリックスに変換する必要があることは理解していますが、それを機能させることができません。
ありがとう!
スクリプティングRe:各行の値を数える小さな質問ですが、列ごとに必要ですか、それとも全体的に必要ですか?
Re:各行の値を数えるカウントを計算する1つの方法である式は次のとおりです
count = 0;
For( i = 1, i <= 6, i++,
count = Sum( count, Contains( As Column( i ), "test" ) )
);
count;
count = 0;
For( i = 1, i <= 6, i++,
count = Sum( count, Contains( As Column( i ), "POR" ) )
);
count;
Re:各行の値を数えるすべてのために、しかしそれは行ごとです
各行のように、値がその行内に出現した回数をカウントし、その行の最後に「カウント」値を書き込みます
以下の私の例を参照してください私はいくつかのテーブルを追加しましたRe:各行の値を数える別の方法。
行全体でカウントする列式
この数式は、データテーブルの添え字を使用して、行8の{"test"、 "POR"、 "test"、 "test"}のようなリストを取得します。
上記では1 :: 4を使用しましたが、これはショートカットとしてIndex(1,4)になります。 {Column1、Column 2、..を使用する必要があります 代わりに、値の1つを「xyzzy」に変更すると、数式を強制的に再実行するまで数式の列の値が更新されなかったためです。 JMPが、ある列が別の列を参照していることを認識できない場合、再評価は行われません。
これはうまく機能します:
明示的な列名を持つ数式
Re:各行の値を数えるとてもかっこいい........しかし、私はあなたが大きな深淵に少し足を踏み入れたと思いますRe:各行の値を数える私は知っています...しかし、それは時間の観点から驚くほど良い方法です。 興味深いことに、concatメソッドは、奇妙なことに、非常に高速です。
たとえば、これらの値の200,000行x 10列のテーブル(圧縮ファイルが添付されている)の場合、ランタイムは次のようになります。

Names Default To Here( 1 );
dt = Current Data Table();
t1 = HP Time();
dt << new column("xx",
formula(sum( design (dt[row(), {:col1, :col2, :col3, :col4, :col5, :col6, :col7, :col8, :col9, :col10}], {"test"})))
);
t2 = hptime();
dt << New Column( "xx",
formula(
count = 0;
dt = :Col1 << get data table;
For( i = 1, i <= 10, i++,
If( Column( dt, i )[Row()] == "test", count ++)
);
count;
)
);
t3 = hptime();
dt << new column("xx", formula(nrow(loc(dt[row(), {:col1, :col2, :col3, :col4, :col5, :col6, :col7, :col8, :col9, :col10}], "test"))));
t4 = hptime();
dt << new column("concat", character, formula(Col1 || :Col2 || :Col3 || :Col4 || :Col5 || :Col6 || :Col7 || :Col8 || :Col9 ||:Col10));
dt << new column("xx", formula(length(:concat)-30));
t5 = hptime();
print(evalinsert("Design matrix method: ^(t2-t1)/1e6^ seconds."));
print(evalinsert("Looping method: ^(t3-t2)/1e6^ seconds."));
print(evalinsert("Nrow(Loc()) method: ^(t4-t3)/1e6^ seconds."));
print(evalinsert("Concat method: ^(t5-t4)/1e6^ seconds."));
Re:各行の値を数えるこんにちは、
さらに別の方法では、すべての列を1クリックの変換で連結します。
「test」はPORより1文字多く、データの欠落がないため、結果の文字列は、「POR」のみの刺し傷と比較して、含まれる「test」ごとに1文字ずつ増加します。
連結するには、目的の列を選択して右クリックし、以下のように選択します。 次に、簡潔にするために列の名前を「concat」に変更します。

以下の表の例では、関心のある6つの列があります。したがって、「POR」のみを含む文字列は、6 * 3 = 18文字になります。
したがって、次の式を使用します。
length(:concat)-「test」の数は18 == n_test。
そして
6-「POR」の数のn_test。
一般に、n_testには、(length(:concat)-18)/ kを使用します。ここで、kは2つのフレーズ間の文字の差です。 ここでは、k == 1なので、省略します。

乾杯、
ブレイディ
Re:各行の値を数える私はこれが好きです、クレイジ。
計画行列機能もこのアイデアを処理できるようです。この式を試して、「a」の数を数えてください。
dt = :Col1 << get data table;
Sum( Design( dt[Row(), {:Col1, :Col2, :Col3, :Col4, :Col5}], {"a"} ) );
Re:各行の値を数えるねえ、これは動作しません
たとえば、これで実行すると
| POR | POR | POR | POR |
| POR | POR | POR | POR |
| テスト | POR | POR | テスト |
| テスト | POR | POR | テスト |
| POR | POR | POR | POR |
| POR | POR | POR | POR |
| テスト | POR | POR | テスト |
| テスト | POR | テスト | テスト |
カウントは0として出てきます
「テスト」を実行したときに期待するのは、0,2,2,0,0,2,3です。
したがって、出力は次のようになります。
| POR | POR | POR | POR | 0 |
| POR | POR | POR | POR | 0 |
| テスト | POR | POR | テスト | 2 |
| テスト | POR | POR | テスト | 2 |
| POR | POR | POR | POR | 0 |
| POR | POR | POR | POR | 0 |
| テスト | POR | POR | テスト | 2 |
| テスト | POR | テスト | テスト | 3 |