经过几个小时的互联网搜索,似乎没有关于如何完成我想做的事情的明确答案,并且在多次编码尝试之后,这显然是 JSL 与其他编程语言显着不同的领域之一。 我有 CSV 文件,它们在客户的自定义 VBA 程序中用作数据库。 使用 CSV 文件的原因很大程度上是因为可以轻松地将数据库导入到 JMP 中以执行定期分析,而无需像以前版本的自定义工具所要求的那样创建专门的导出功能。 我正在构建一个脚本来导入数据库文件并执行一些初步准备,以便数据表中的所有内容都就位,以便可以执行性能分析。 其中大部分内容都是非常常规的,并且到目前为止已在我的 JSL 脚本中完成。
我现在遇到的问题是,我在几个地方有零值,而这些地方实际上应该是缺失值。 这些零是由于使用 VBA 中的数据对象从 Excel 导出数据而产生的。数据库文件中的数据永远不会出现在工作表上,因为自定义 Excel 工具完全基于 GUI,因此实际丢失的数据在构成代码中数据对象的属性中具有默认值 0; VBA 没有与数值数据类型的缺失数据等效的功能。
因此,我想要做的就是根据其他列中的标志将特定列中的零替换为缺失值。 例如,如果给定行中的“取消的读取数据”列为“False”,则与该行的取消的读取调查关联的所有列都应该缺少值,因为未针对该特定进行取消的读取调查记录。 同样,如果“调查已取消”列的值为“真”,则该行中的所有调查数据列都应包含缺失值,因为没有对该记录进行任何类型的调查。 设置零后,各种统计数据将会出现偏差,因为 JMP 将在分析中包含应忽略的记录。
我尝试了两种不同的方法都没有效果。 第一个是使用条件并循环遍历列:
// set canceled data to missing if canceled survey was not performed
If(:Canceled Reads Data == "True",
{
For(i = vehiclePackageColumn, i < expiredReadsColumn, i++,
Column(i) = .
)
}
);这里的部分问题似乎是列引用(vehiclePackageColumn 和expiredReadsColumn)不是列号,因为使用vehiclePackageColumn = Column("Vehicle Packages") 不会返回“Vehicle Packages”列的列号。 事实上,我找不到任何有关如何使用 JSL 捕获列的列索引(数字)的信息。
第二种方法是基于我在另一个论坛上看到的东西:
cancelSurveyStatus = Column(inboundDataTable, "Canceled Reads Data") << Get Values;
dataMissing[Loc(canceledSurveyStatus == "False")] = .;
Column(inboundDataTable, "Canceled Reads") << Set Values(dataMissing);
任何对此的帮助将不胜感激。
这是个简单的:
colnames = dt << 获取列名称(字符串);
startindex = contains(colnames, "起始列的名称");
endindex = contains(colnames, "结束列的名称");
是的!
Jim,这似乎解决了根据特定列中标志的状态将缺失值放入一系列列中的主要问题。 因此,唯一剩下的问题是是否有办法捕获列索引。 我的数据表相当大,必须像我在测试您建议的代码时那样手动计算列数,这是乏味的并且容易出错;这个特定的数据表有 73 列。如果仅对于这样的操作,缺乏确定 JSL 中命名列的列号的方法是一个严重的遗漏。
我认为这会起作用:
dt = 当前数据表();
For( i = 你的起始列号, i <= 你的结束列号, i++,
column( dt, i ) [ dt << 获取行 where( :Canceled Reads Data == "True")] = .;
);