おはよう、
誰かが私を助けることができますか? ...
数値列の空の値を置き換えたい列の平均値。
私はこれを試しました
dt =現在のデータ テーブル();
塗りつぶし = dt <<列名を取得する(数値);
ために( i = 1 、私 <= Nアイテム( 塗りつぶし ), i++,
FILL[i][dt <<行を取得する場所(不足している( FILL[i][] ) )] =コル平均(FILL[i]);
);
前もって感謝します
ジャンパオロ
あなたのコードを詳しく調べたわけではありませんが、必要以上の仕事をしているように感じました。 読みやすくするために、次のような関数の使用を検討できます。
NamesDefaultToHere(1);
// Only impute if more than n cells are missing
imputeContinuousCol =
Function({col, n}, {Default Local},
values = col << getValues;
missingValuePos = Loc(IsMissing(values));
if(NRow(missingValuePos) > n,
values[Loc(IsMissing(values))] = Mean(values);
col << setValues(values);
);
);
// Only impute if more than n cells are missing
imputeCharacterCol =
Function({col, n}, {Default Local},
values = col << getValues;
missingValuePos = Loc(values, "");
if(NRow(missingValuePos) > n,
values[Loc(values, "")] = "NA";
col << setValues(values);
);
);
// Data table . . .
dt = DataTable("Big Class.jmp");
// List of column names that satidfy your imputation criteria . . .
imputeList = {"name", "sex", "height"};
// Loop over this list, and impute if necessary
for (c=1, c<=NItems(imputeList), c++,
col = Column(dt, imputeList[c]);
if(
(col << getModelingType) == "Continuous",
imputeContinuousCol(col, 1),
(col << getDataType) == "Character",
imputeCharacterCol(col, 1),
);
);
「Big Class」を開き、リストされた列で欠落しているセルをいくつか作成してから、試してみてください。
こんにちはイアン
まず、あなたの助けと提案に感謝します。あなたのスクリプトは非常にうまく機能します
それで.... DBを削減して単純化するために、スクリプトをより大きなスクリプトに統合しようとしました。
全作品はこちら
名前のデフォルトはここ ( 1 ) です。
クリア グローバル ();
// 開いているすべてのテーブルから、分析用に選択するテーブルを選択するコード
OpenDT = リスト();
For( i = 1, i <= N テーブル(), i++,
Insert Into( OpenDT, データテーブル( i ) )
);
dlgDT = Dialog( "分析用のデータ テーブルを選択", VList( selectDT = リスト ボックス( OpenDT ) ), HList( Button( "OK" ), Button( "キャンセル" ) ) );
表示 (dlgDT);
If( dlgDT["ボタン"] == 1,
削除元( dlgDT, N 個のアイテム( dlgDT ) );
評価リスト( dlgDT );
);
現在のデータ テーブル ( selectDT[1] );
// ------------------------------------------GUI ------ -----------------------------------//
cd = 列ダイアログ(
Title( " データ前処理 " ),
List= ColList( " 列を選択 >> ", MinCol( 1 ) ),
HList( " 列内の空要素の % -> (0-100) ", mypercent1 = EditNumber( 50 ) ),
HList( " 列内の停滞要素の % -> (0-100) ", mypercent = EditNumber( 80 ) ),
VList(
numeric = Check Box( "列の数値 - 欠落しているセルを他のセルの平均で代入する", 1 ),
character = Check Box( "列の文字 - 欠損セルを N/A で代入", 1 ),
)、
);
//変数の宣言
impute_num_col = cd["数値"]; // 数値を代入
impute_char = cd["文字"]; // 補完文字
パーセント = cd["私のパーセント"];
percent1 = cd["mypercent1"];
mylist = cd["リスト"];
dt= selectDT[1];
delcols = {};
numRows = nrows(dt);
for(i=1; maxi=Nitems(mylist), i<=maxi, i++,
if(nrows(loc(aslist(column(dt,mylist[i])<= numRows * パーセント/100,
(delcols, myList[i]); に挿入します。
、
if(Col N Missing(column(dt,mylist[i])) >= numRows * percent1/100,
(delcols, myList[i]); に挿入します。
);
);
);
nitems = N Items( delcols );
colname = {};
colnamelist = {};
For( p = 1, p <= nitems, p++,
colname = Column( delcols[p] ) << Get Name;
Insert Into( colnamelist, colname(p) );
);
dt << 列を削除 (colnamelist);
//OK! 列数値 - 欠落しているセルを他のセルの平均で代入します
If( impute_num_col == 1,
cc = dt << Get Column Names( Continuous );
ncols = N 個のアイテム ( cc );
For( i = 1, i <= ncols, i++,
値 = 列 ( dt, cc[i] ) << 値を取得 ( 1 );
values[Loc( Is Missing( 値 ) )] = Mean( 値 );
Column( dt, cc[i] ) << setvalues( 値, cc[i] );
);
);
// 列の文字 - 欠落しているセルを NA で代入します
If( impute_char == 1,
FILL = dt << get column names( Character );
For( i = 1, i <= N Items( FILL ), i++,
FILL[i][dt << get rows where( Is Missing( FILL[i][] ) )] = "NA";
);
);
しかし、問題は、スクリプトの最後の部分 (#Columns 文字 - 欠けているセルを NA# で代入)
理由がわからない...うまくいかない....
上記のジョブに統合されていない場合でも同じコードが機能するため、非常に奇妙です。
dt = 現在のデータ テーブル();
FILL = dt << get column names( Character );
For( i = 1, i <= N Items( FILL ), i++,
FILL[i][dt << get rows where( Is Missing( FILL[i][] ) )] = "NA";
);
なぜそれが起こっているのか分かりますか... ?
協力してくれてありがとうRe: 数値列の空の値を列の平均値に置き換える方法これを行う1つの方法を見つけてください:
NamesDefaultToHere(1);
// Make some test data
dt = NewTable("Test", NewColumn("Data", Numeric, Continuous, Formula(if(Mod(Row(), 2) == 0, RandomNormal()))));
dt << addRows(20);
dt << runFormulas;
Column(dt, "Data") << deleteFormula;
// Impute missing cells with the mean of the others
Wait(3);
col = Column(dt, "Data");
values = col << getValues;
values[Loc(IsMissing(values))] = Mean(values);
col << setValues(values);
おそらく、セルに色を付けて帰属された値を線引きするのは良い習慣です。