有没有办法自动重新评估数据类型?如果我有一个分为不同列的数据表,则所有列都会按预期显示“字符”数据类型。
现在,我们有没有办法编写一个 JSL 脚本来自动重新评估数据类型应该是数字还是字符? 如果发现数据输入是数字,是否将数据类型更改为数字?
回复:有没有办法自动重新评估数据类型?一种方法是计算缺失值的数量,获取值列表,强制列为数字,然后再次计算缺失值的数量。 如果前后缺失的数量相同,则您有一个数字列。 如果不是,请将其更改回来并用副本替换这些值。
当非数字值(如 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)
)
)
回复:有没有办法自动重新评估数据类型?不要让我找到解决方案,但另一种选择是使用正则表达式来确定每列是否仅包含数字和句点(小数点)字符。 下面的示例获取每一列,将其所有值连接成一个大字符串,然后检查该字符串是否包含任何非数字或小数点的字符 ( [^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" );
)
);
回复:有没有办法自动重新评估数据类型?如果您不需要自动化解决方案,则重新编码中有一个红色三角形解析为数字选项。 它将任何非数字条目(如 NA)更改为缺失值。
回复:有没有办法自动重新评估数据类型?这种方法的一个潜在问题是它不支持科学记数法。 修改正则表达式以接受科学记数法和负数,同时拒绝电话和社会安全号码等内容,这使得它变得更加复杂(哈!双关语!)。
回复:有没有办法自动重新评估数据类型?这是我推荐的方法。 根据可能遇到的数据,我还做了以下操作:
1) 仅使用每列的前 k 行来做出决策,以提高效率。
2) 允许给定列(或其子集)中存在一定百分比的缺失(根据需要进行调整)。 低于此阈值,无论如何都转换为数字。
回复:有没有办法自动重新评估数据类型?除了已经提到的复杂性之外,解决方案还考虑将逗号作为小数占位符或作为 1000 的数字分隔符。 这样它也可能是一个更加国际化的解决方案。
回复:有没有办法自动重新评估数据类型?好点(也是双关语),布雷迪。 此正则表达式解决方案适用于表现良好的示例数据,但不能推广到所有可能的数据。 我想有一个主正则表达式可以完成这项工作,但想出它可能是一件苦差事。 或者,可以使用一个或多个更简单的包含项目检查来循环遍历列中的每一行;例如,一个可以允许初始破折号(对于负数)但拒绝任何包含非初始破折号的内容,然后另一个可以检查该行是否符合科学计数法。 如果列中所有行的所有检查均通过,则更改数据类型。 正如你所说,“明显”更复杂。
回复:有没有办法自动重新评估数据类型?我参加聚会有点晚了,但“欺骗”的方法是将文件导出为 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");