データが欠落した場合の対処方法<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />こんにちは、
膨大な数の列に対して記述的な分析を実行する必要があります。 そのために、次のスクリプトを作成しました。
dt = 現在のデータ テーブル();
column_names = dt << 列名を取得(数値,文字列);
for(i=3,i<=NItems(column_names),i++,
列名 = 列名;
cmd = Expr(
ow = dt << 分布(
連続分布( 列( cName ) )、
Where( :SEX == "F" )
);
owr = ow<<レポート;
);
Into(cmd,Expr(cName),colName); に代入します。
評価(cmd);
);
現在の日記() << HTMLを保存("....\test.htm");
これを実行すると、ログ ウィンドウに「1 つ以上の列には欠損値以外何もありません。」というエラー メッセージが表示されます。
すべての値、または特定の「性別」の値のみがデータ欠落している列がいくつかあります。 ループ内でそれをチェックし、分析でそれらをスキップするにはどうすればよいでしょうか?
ありがとう
Re: データが欠落した場合の対処方法様へ、
この最後のスクリプトは完璧に機能しました。 この議論で私は多くのことを学びました。
皆様のご指導に改めて感謝申し上げます。
Re: データが欠落した場合の対処方法スタックは、データを 1 つの列に配置するための単なる中間ステップです。 エラーは、ラベル列またはデータ列のいずれかが、ここで要約コマンドが想定している名前「Position」と「Data」を取得していないことである可能性があります。 「非表示」オプションを削除し、積み上げテーブルを調べて列名を確認し、意図したとおりに名前が付けられていない場合は、それに応じて概要を変更します (Stacked Data Column("Data") 引数の上の jsl コメントにあるように、元のテーブルのように列がグループ化されている場合、JMP 10 では無視されるため、上記の例ではグループ解除コマンドが使用されます。
スタックの代わりに、それが不正な動作をする場合は、代わりに要約と転置を並行して使用して、同様の結果を得ることができます。 以下の例を試してください (投稿されたテーブル「例」で動作します)。
dt =データ表( "例" ) ;
列名= dt <<列名の取得(数値) ;
( dt <<まとめ(
グループ( :セックス) 、
平均(評価(列名) ) 、
統計列名の形式( "桁" )
)) <<転置(ラベル( :セックス) 、出力テーブル( "結果" ) ) ;
Re: データが欠落した場合の対処方法様へ、
この新しい方法を提案していただきありがとうございます。 そのほうが早くて効率的だと思います。 ただし、スクリプトを実行すると、次のようなエラーが発生します。
「不正な引数」のアクセスまたは評価で列が見つかりませんでした
Send は、 'Send' のアクセスまたは評価でスクリプト可能オブジェクトを期待します、 dt_stacked << Summary( Group( :Position ), Mean( :Data ), Subgroup( :SEX ) )
次のスクリプトでは、/*###*/ でマークされたエラーが発生します。
::dt = データ テーブル( "例" );
::column_names = ::dt << 列名を取得( 数値 );
::dt_stacked = ::dt << スタック(
列( ::column_names )、
ソースラベル列( "位置" )、
積み上げデータ列( "データ" )、
見えない
);
::dt_sum = ::dt_stacked << /*###*/要約(
グループ( :位置 )、
平均( :データ )、
サブグループ( :SEX )
) /*###*/;
列( 3 ) << セット名( "女性" );
列( 4 ) << セット名( "男性" );
dt_sum << New Column( "比率", Formula( Female / Male ) );
dt_stacked << ウィンドウを閉じる;
スタックの作成に問題があるようです。 なぜこのようなエラーが発生したのかわかりますか?
皆様のご協力に改めて感謝申し上げます。
Re: データが欠落した場合の対処方法上に投稿したテーブル例にスクリプトを適用しても、そのメッセージは表示されません。 ただし、owr[NumberColBox(4)];存在しないためエラーが発生します。 これまでのコードでは、「F」の結果のみが提供され、「M」の結果は提供されません。これも結果テーブルにリストしたいと思われます。
唯一の目的が要約することである場合は、多数の配布レポートをループする代わりに Summary() 関数を使用します。
例:
dt =データ表( "例" ) ;
列名= dt <<列名の取得(数値) ;
dt <<列のグループ化を解除する(列名) ; // スタックされたデータ列名とグループ化された列に関する JMP 10 のバグのようです
dt_stacked = dt <<スタック(
列(列名) 、
ソースラベル列( "位置" ) 、
積み上げデータ列( "データ" ) 、
見えない
) ;
dt_sum = dt_stacked <<まとめ(
グループ( :位置) 、
平均( :データ) 、
サブグループ( :セックス)
) ;
桁( 3 ) <<セット名( "女性" ) ;
桁( 4 ) <<セット名( "男" ) ;
dt_sum <<新しい列( "比" 、方式(女性/男) ) ;
dt_stacked <<ウィンドウを閉じる;
Re: データが欠落した場合の対処方法次のようにスクリプトを変更しました。
dt = データテーブル("例") ;
column_names = dt << 列名を取得(数値,文字列);
results = 新しいテーブル("結果", 表示されます,
新しい列("位置", 文字),
新しい列("女性"、数値)、
新しい列("男性"、数値)、
新しい列(「比率」、式(女性/男性))、
行の追加(NItems(column_names))
);
for(i=1,i<=NItems(column_names),i++,
If( N Row( dt << get rows where( And( :SEX[] == "F", !Is Missing( Column( 列名)[] ) ) ) )、
列名 = 列名;
cmd = Expr(
ow = dt << Distribution( Continuous Distribution( Column( cName ) ),
Where( :SEX == "F" ) );
owr = ow<<レポート;
allmean=owr[NumberColBox(2)];
Fmean = すべての平均[1];
allmean1= owr[NumberColBox(4)];
Mmean = allmean1[1];
列(結果,1) = 列名;
列(結果,2) = Fmean;
列(結果,3) = 意味;
ow << ウィンドウを閉じる;
);
Substitute Into( cmd, Expr( cName ),colName );
Eval( cmd );
)
);
結果 << ジャーナル;
ログウィンドウにこのメッセージが表示されます
「列が見つかりませんでした{1}
'Column' へのアクセスまたは評価において、 Column( column_names )」
そしてそれは次の行を指します:
「:SEX[] == "F" & !Is Missing( Column/*###*/(::column_names[::i])[] )」
アドバイスありがとう
Re: データが欠落した場合の対処方法間違った場所にあることがエラーの原因だと思います
dt = 現在のデータテーブル()
元のテーブルではなく、新しいテーブル "Results" を dt に割り当てます。 そして、Results には :SEX という名前の列がありません。
代わりに dt = data table("Example") を試してください。
Re: データが欠落した場合の対処方法様へ、
ご指導ありがとうございます。 提案されたコードを追加し、次のように結果をテーブルにエクスポートするようにスクリプトを変更しました。
results = 新しいテーブル("結果", 表示されます,
新しい列("位置", 文字),
新しい列("女性"、数値)、
新しい列("男性"、数値)、
新しい列(「比率」、式(女性/男性))、
行の追加(NItems(column_names))
);
dt = 現在のデータ テーブル();
column_names = dt << 列名を取得(数値,文字列);
for(i=1,i<=NItems(column_names),i++,
If( N Row( dt << get rows where( And( :SEX[] == "F", !Is Missing( Column( 列名)[] ) ) ) )、
列名 = 列名;
cmd = Expr(
ow = dt << Distribution( Continuous Distribution( Column( cName ) ),
Where( :SEX == "F" ) );
owr = ow<<レポート;
allmean=owr[NumberColBox(2)];
Fmean = すべての平均[1];
allmean1= owr[NumberColBox(4)];
Mmean = allmean1[1];
列(結果,1) = 列名;
列(結果,2) = Fmean;
列(結果,3) = 意味;
ow << ウィンドウを閉じる;
);
Substitute Into( cmd, Expr( cName ),colName );
Eval( cmd );
)
);
結果 << ジャーナル;
さて、実行するとSEXでエラーが発生します。 テスト用のデータ ファイルの例を添付しました。
よろしくお願いいたします。
Re: データが欠落した場合の対処方法(いつものように) それにはいくつかの方法があります。 以下は、うまくいくはずの 1 つのアプローチです。
dt =現在のデータテーブル() ;
列名= dt <<列名の取得(数値、弦) ;
ために(私= 3 、私<= N 個のアイテム(列名) 、私++、
// SEX="F" > 0 の列 i に欠落がない場合は処理を行い、そうでない場合は次の i
もしも( N列( dt <<行を取得します。 (と( :セックス[] == 「ふ」 、 !不足している(桁(列名[私】 )[] ) ) ) ) 、
列名=列名[私】 ;
cmd =エクスプレッション(
ああ= dt <<分布(継続的な配布(桁( cName ) ) 、どこ( :セックス== 「ふ」 ) ) ;
ああ=ああ<<報告;
) ;
に代入( cmd 、エクスプレッション( cName ) 、列名) ;
評価( cmd ) ;
)
) ;
現在の日記() << HTMLを保存( 「....\test.htm」 ) ;