用于分箱的 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() 替换脚本中指向列的每个点,但是,这种计算开销使代码运行,每列处理大约需要一分钟。代码的替代版本,可以在几秒钟内完成整个处理。