用於分箱的 JSL 腳本你好,
我有一個 1248 行和 2435 列的稀疏矩陣。 我的第一列是 CustomerID,其餘的是每個客戶訂購的數量作為值的產品。 每列都有不同的範圍。 我想通過在 20% 處設置切點來將列值標準化為 1 - 5。 我發現如果列數較少,交互式分箱插件可以幫助我完成。 我是 JMP 的新手,如果有人可以幫助我使用 JSL 腳本來實現這一點,我將不勝感激。 分箱應排除缺失值。
我附上了我的數據表以供參考。 提前致謝。
問候,
塔拉

回复:用於分箱的 JSL 腳本謝謝吉姆。 我將手動重新編碼這些列名。 再次感謝您的幫助!
回复:用於分箱的 JSL 腳本注意:我剛剛發現另一個問題....同樣的問題更複雜。有些列的名稱中有雙引號......這會導致腳本出錯......
這可以解決......但我認為最簡單的解決方案是將名稱中的雙引號更改為單引號(手動),然後使用下面提到的更改運行腳本。
這是一個常見問題,我應該保護這個問題。
第 7 列命名為:
BONNE JAM JAR T 燈架
除非有保護,否則 JMP 不會將該名稱解釋為單個列名,而是 2 列,
邦尼果醬罐
和
燈座
然後 JMP 將嘗試從另一個中減去一個,因為它會在兩個名稱之間找到一個減號“-”。為了防止這些複雜的列名,JMP 有一個名為 :Name() 的函數。因此,如果您在代碼中替換以下行:
Expr( __col__ ), Parse( ":" || Char( Column( dt, i ) << get name ) )
和:
Expr( __col__ ), Parse( ":Name(\!"" || Char( Column( dt, i ) << get name ) || "\!")")
它會起作用的
回复:用於分箱的 JSL 腳本嗨,吉姆,
感謝您的時間和回复。 該腳本在前 7 列中運行良好。 我無法弄清楚為什麼它沒有進一步進行。 我已附上 jmp 文件供您參考。我對你的腳本做了一些小改動: dt = Current Data Table (); , i = 2 和 _col_[RowP80_100] = 5。 休息保持不變。
謝謝
塔拉
回复:用於分箱的 JSL 腳本這是一個示例腳本,應該可以執行您想要的操作。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\Semiconductor Capability.jmp" );
For( i = 5, i <= N Cols( dt ), i++,
Eval(
Substitute(
Expr(
RowsP0_20 = dt << get rows where( __col__ <= Col Quantile( __col__, .2 ) );
RowsP20_40 = dt << get rows where(
__col__ > Col Quantile( __col__, .2 ) & __col__ <=
Col Quantile( __col__, .4 )
);
RowsP40_60 = dt << get rows where(
__col__ > Col Quantile( __col__, .4 ) & __col__ <=
Col Quantile( __col__, .6 )
);
RowsP60_80 = dt << get rows where(
__col__ > Col Quantile( __col__, .6 ) & __col__ <=
Col Quantile( __col__, .8 )
);
RowsP80_100 = dt << get rows where( __col__ > Col Quantile( __col__, .8 ) );
__col__[RowsP0_20] = 1;
__col__[RowsP20_40] = 2;
__col__[RowsP40_60] = 3;
__col__[RowsP60_80] = 4;
__col__[RowsP80_100] = 1;
),
Expr( __col__ ), Parse( ":" || Char( Column( dt, i ) << get name ) )
)
)
);
腳本比它必須要復雜的多。也就是說,它可以使用 As Column() 替換腳本中指向列的每個點,但是,這種計算開銷使代碼運行,每列處理大約需要一分鐘。代碼的替代版本,可以在幾秒鐘內完成整個處理。