データ型を自動的に再評価する方法はありますか?データテーブルを複数の列に分割すると、すべての列が期待どおり「文字」データ型になります。
さて、データ型が数値であるべきか文字であるべきかを自動的に再評価する JSL スクリプトを作成する方法はあるでしょうか? データ入力が数値であることが判明した場合は、データ型を数値に変更しますか?
Re: データ型を自動的に再評価する方法はありますか?1 つのアプローチは、欠損値の数を数え、値のリストを取得し、列を強制的に数値にしてから、再度欠損値の数を数えることです。 欠損値の数が前後で同じであれば、数値列が得られます。 そうでない場合は、値を元に戻し、値をコピーに置き換えます。
これが失敗するのは、NA などの数値以外の値が数値列に出現する場合です。
Names Default to Here(1);
tblRef = Current Data Table();
For(i=1,i<=N Col(tblRef),i++,
nMissing = Col N Missing(Column(tblRef,i));
nextVals = Column(tblRef,i) << Get Values;
Column(tblRef,i) << Set Data Type(Numeric);
If(Col N Missing(Column(tblRef,i)) != nMissing,
Column(tblRef,i) << Set Data Type(Character);
Column(tblRef,i) << Set Values(nextVals)
)
)
Re: データ型を自動的に再評価する方法はありますか?解決策は私に負けませんが、もう 1 つの選択肢は、正規表現を使用して、各列に数字とピリオド (小数点) 文字のみが含まれているかどうかを判断することです。 以下の例では、各列を取得し、そのすべての値を 1 つの大きな文字列に連結し、その文字列に数字または小数点 ( [^0-9\.] 以外の文字が含まれているかどうかを確認します) )。 列全体で数値と小数点のみが見つかった場合 (つまり、「項目を含む」がゼロと評価された場合)、データ型を数値に設定します。
Names Default to Here( 1 );
cols = Current Data Table() << Get Column Names();
for( i = 1, i <= Length( cols ), i++,
vals = As Column( cols[i] ) << Get Values;
valsConcat = Concat Items( vals, "" );
If( Contains Item( valsConcat, Pat Regex( "[^0-9\.]") ),
Continue(),
As Column( cols[i] ) << Set Data Type( "Numeric" );
)
);
Re: データ型を自動的に再評価する方法はありますか?自動化されたソリューションが必要ない場合は、Recode に赤い三角形の [数値として解析] オプションがあります。 数値以外のエントリ (NA など) を欠損値に変更します。
Re: データ型を自動的に再評価する方法はありますか?このアプローチの潜在的な問題は、科学表記法がサポートされていないことです。 電話番号や社会保障番号などを拒否しながら、科学的表記法や否定表現を受け入れるように正規表現を変更すると、正規表現が大幅に (ハッ! 冗談!) 複雑になります。
Re: データ型を自動的に再評価する方法はありますか?これが私がお勧めするアプローチです。 発生する可能性のあるデータに応じて、次のことも実行しました。
1) 効率を高めるために、各列の最初の k 行のみを使用して決定を行います。
2) 特定の列 (またはそのサブセット) の欠落をある程度の割合で許容します (必要に応じて調整します)。 このしきい値を下回る場合は、とにかく数値に変換します。
Re: データ型を自動的に再評価する方法はありますか?すでに述べた複雑さに加えて、このソリューションでは、カンマを小数点のプレースホルダまたは 1000 の位の数値区切り文字として考慮します。 そうすれば、より国際的なソリューションにもなる可能性があります。
Re: データ型を自動的に再評価する方法はありますか?良い指摘(そしてダジャレ)、ブレイディ。 この正規表現ソリューションは、適切に動作するサンプル データに対しては機能しますが、考えられるすべてのデータに一般化できるわけではありません。 仕事を成し遂げることができるマスター正規表現が 1 つあると思いますが、それを思いつくのは面倒かもしれません。 あるいは、1 つ以上の単純な項目を含むチェックを使用して、列内の各行をループすることもできます。たとえば、最初のダッシュ (負の数値の場合) は許可するが、先頭以外のダッシュを含むものはすべて拒否することができ、別の場合は行が科学的表記法に準拠しているかどうかをチェックできます。 列内のすべての行についてすべてのチェックに合格した場合は、データ型を変更します。 あなたが言うように、「大幅に」より複雑です。
Re: データ型を自動的に再評価する方法はありますか?パーティーに少し遅れましたが、「ずるい」方法は、ファイルを CSV としてエクスポートし、再インポートすることです。これにより、ファイルを開いたときに JMP が列のタイプを自動的に決定します。 ただし、これはテーブル スクリプトや列プロパティを保存する必要がないことを前提としています。 これがスクリプトです。
//assume file is in the downloads folder
dt = open ("$DOWNLOADS/Data to Split.jmp");
dtsplit = Data Table( "Data to split" ) << Split(
Split By( :Label ),
Split( :Data ),
Output Table( "Split Data.jmp" ),
Sort by Column Property
);
close (dt, no save);
dtsplit << Save as ("$DESKTOP/Split Data.csv");
close (dtsplit, no save);
ndt = open ("$DESKTOP/Split Data.csv");