こんにちは、
2015 年のディスカッション (件名「sumif」) を見つけました。現在のタスクに非常に役立つスクリプトがあります。そこに質問を書きましたが、そのディスカッションに参加した人が私の質問を閲覧できるかどうかはわかりません。
私が見つけたこのスクリプト (わずかに変更) は、値が「0/0」(またはその他) である各行の列を数えるのに最適です。
dt << New Column("Sum",
Numeric, Formula(
Local({i = 0, n = N Col(Current Data Table()) - 1},
Sum(Repeat({i++ ; (Column(i)[] =="0/0")}, n))
)
)
);ただし、このスクリプトを編集して、「some_character」を含む列をカウントするにはどうすればよいでしょうか?
最後の列「合計」に数式と必要な結果の数値が含まれるデータテーブルを添付しました。
大きなデータテーブルがあり、特定の値(文字として)を持つ各行の列をカウントするスクリプトを作成したいと考えています。
上記のスクリプトを変更しようとしましたが、機能しませんでした。
dt << New Column("Miss",
Numeric, Formula(
Local({i = 0, n = N Col(Current Data Table()) - 1},
Sum(Repeat({i++ ; (Contains(Column(i)[],"."))}, n))
)
)
);</CODE>Please, help</P><P>ヴァレンティナ</P></LINGO-BODY><LINGO-LABS id="lingo-labs-737490" slang="en-US" mode="CREATE"><LINGO-LABEL>自動化とスクリプト作成</LINGO-LABEL></LINGO-LABS><LINGO-SUB id="lingo-sub-737514" slang="en-US" mode="CREATE">Re: sumif: 文字が含まれている場合は列をカウントします</LINGO-SUB><LINGO-BODY id="lingo-body-737514" slang="en-US" mode="CREATE"><P>これには公式が必要ですか?</P></LINGO-BODY><LINGO-SUB id="lingo-sub-737576" slang="en-US" mode="CREATE">Re: sumif: 文字が含まれている場合は列をカウントします</LINGO-SUB><LINGO-BODY id="lingo-body-737576" slang="en-US" mode="CREATE"><P>申し訳ありませんが、質問がわかりません。</P><P>約 500,000 行、約 3,000 列のテーブルがあります。ドットを含む列の合計を計算する必要があります。数式は使用できません。 。</P><P>スクリプトが欲しいのですが、機能するスクリプトなら何でもいいです。さまざまなアプローチを試しましたが、どれもうまくいきませんでした。 。</P></LINGO-BODY><LINGO-SUB id="lingo-sub-737577" slang="en-US" mode="CREATE">Re: sumif: 文字が含まれている場合は列をカウントします</LINGO-SUB><LINGO-BODY id="lingo-body-737577" slang="en-US" mode="CREATE"><P>これは私のログからのものです:</P><P> </P><P>列合計の計算式が中断されました<BR />'Contains' のアクセスまたは評価における行 421001 の引数の型が間違っています、Bad Argument( Column( i )[] )、Contains/*###*/(Column( i )[], ".")<BR />数式評価エラーは無視されました</P></LINGO-BODY><LINGO-SUB id="lingo-sub-737582" slang="en-US" mode="CREATE">Re: sumif: 文字が含まれている場合は列をカウントします</LINGO-SUB><LINGO-BODY id="lingo-body-737582" slang="en-US" mode="CREATE"><P>おそらく、ループは文字列ではない列に到達しています。この部分はおそらく何らかの修正が必要です</P>
<PRE><CODE class=" language-jsl">n = N Col(Current Data Table()) - 1
データに関する知識がなければ、それをどのように行うべきかを知ることは非常に困難です。 -1 を単純に変更するだけで、文字列のリストを取得したり、ある種のパターンによってどの列を通過するかを計算したりすることができます。
私の投稿に小さなデータ表を添付しました。ヘッダーを含む 3 行 3 列があります。
S1 S2 S3
0/0./. 0/0
./. ./. ./.
0/0 0/0 0/0
このサンプルテーブルではスクリプトが機能しません
列合計の計算式が中断されました
'Contains' のアクセスまたは評価における行 1 の引数の型が間違っています、Bad Argument( Column( i )[] )、Contains/*###*/(Column( i )[], ".")
数式評価エラーは無視されました
添付した元のデータ テーブルは 4 つの列があるため、そのようではありませんでした (合計列を無視することはできません)

データに応じて、数式を使用する場合は、次のようにします (ほとんどの場合、数式は使用せず、純粋なスクリプト ソリューションを使用します)。
Names Default To Here(1);
dt = Open("$DOWNLOADS/sum_help_data.jmp");
dt << Delete Column("Sum");
dt << New Column("Miss", Numeric, Continuous, Formula(
As Constant(
cols_of_interest = Filter Each({colname}, Current Data Table() << Get Column Names("String"),
!IsMissing(Regex(colname, "S\d"));
);
);
Local({
res = 0;
},
For Each({colname}, cols_of_interest,
res = res + (Contains(Column(colname)[], ".") > 0);
);
res;
);
));
はい、すべてのデータは同じタイプである必要があるようです。
ありがとうございます。うまくいきました!