インターネットで何時間も検索しても、自分のやりたいことを達成する方法について明確な答えがないように見えます。数のコーディングを試みた後、これは明らかに、JSL が他のプログラミング言語と劇的に異なる領域の 1 つです。 クライアント用のカスタム VBA プログラムでデータベースとして使用される CSV ファイルがあります。 CSV ファイルを使用する主な理由は、データベースを JMP に簡単にインポートして定期的な分析を実行できるようにするためでした。以前のバージョンのカスタム ツールでは必要だった特殊なエクスポート機能を作成する必要はありません。 データベース ファイルをインポートするスクリプトを作成し、パフォーマンス分析を実行できるようにデータ テーブルにすべてを配置するための予備準備を行います。 このほとんどは非常に日常的なものであり、これまでのところ、私の JSL スクリプトで実行されています。
私が今抱えている問題は、実際には値が欠落しているはずのいくつかの場所にゼロ値があることです。 ゼロは、VBA のデータ オブジェクトを使用して Excel からデータをエクスポートした結果です。カスタム Excel ツールは完全に GUI ベースであるため、データベース ファイル内のデータがワークシート上に存在することはありません。そのため、実際に欠落しているデータは、コード内のデータ オブジェクトを構成するプロパティのデフォルト値 0 になります。 VBA には、数値データ型の欠損データに相当するものはありません。
したがって、私がやりたいことは、特定の列のゼロを、他の列のフラグに基づいて欠損値に置き換えることです。 たとえば、「Canceled Reads Data」列の特定の行に「False」が含まれている場合、その行のキャンセルされた読み取り調査に関連付けられているすべての列は値が欠落している必要があります。これは、キャンセルされた読み取り調査がその特定の行に対して実施されていないためです。記録。 同様に、「Survey Canceled」列の値が「True」の場合、そのレコードに対してどのタイプの調査も実施されていないため、その行のすべての調査データ列に欠損値が含まれているはずです。 ゼロを配置すると、JMP は無視すべきレコードを分析に含めるため、さまざまな統計に偏りが生じます。
私は2つの異なる方法を試しましたが、役に立ちませんでした。 1 つ目は、条件を使用して列をループすることでした。
// set canceled data to missing if canceled survey was not performed
If(:Canceled Reads Data == "True",
{
For(i = vehiclePackageColumn, i < expiredReadsColumn, i++,
Column(i) = .
)
}
);ここでの問題の一部は、 vehiclePackageColumn = Column("Vehicle Packages") を使用しても "Vehicle Packages" 列の列番号が返されないため、列参照 (vehiclePackageColumn と expiredReadsColumn) が列番号ではないことにあるようです。 実際、JSL を使用して列の列インデックス (番号) を取得する方法に関する情報は見つかりませんでした。
2 番目の方法は、別のフォーラムで見たものに基づいていました。
cancelSurveyStatus = Column(inboundDataTable, "Canceled Reads Data") << Get Values;
dataMissing[Loc(canceledSurveyStatus == "False")] = .;
Column(inboundDataTable, "Canceled Reads") << Set Values(dataMissing);
これについての助けをいただければ幸いです。
それを試してみました。 よく働く。 ありがとう、ジム。
これは簡単です:
colnames = dt << get column names(string);
startindex = contains(colnames, "開始列の名前");
endindex = contains(colnames, "終了列の名前");
はい!
これにより、特定の列のフラグの状態に基づいて列の範囲に欠損値を取得するという主な問題が解決されたようです、ジム。 したがって、残っている唯一の問題は、列インデックスを取得する方法があるかどうかです。 私のデータテーブルはかなり大きく、提案されたコードのテストで行ったように手動で列を数えなければならないのは面倒でエラーが発生しやすいです。この特定のデータ テーブルには 73 列あります。JSL で名前付き列の列番号を決定する手段がないことは、このような操作の場合に限り、重大な省略です。
私はこれがうまくいくと思います:
dt = 現在のデータ テーブル();
For( i = 開始列番号、i <= 終了列番号、i++、
column( dt, i ) [ dt << get rows where( :Canceled Reads Data == "True")] = .;
);