使用矩阵因此,此演示将说明您可以使用矩阵的一些方法。 因此,在部分课程日志中,我将单击 Cure Time Data。 假设我们需要找到每个日期的平均治愈时间。 因此,我们将每行中的所有固化时间值相加,然后除以样本数。 我将使用矩阵来执行这个计算。 同样,这些矢量化操作将使这更有效。 所以回到课程日志中,我有一个预先编写的脚本,名为 Compute Statistics With Matrices。 让我移动这个,这样我们就可以同时看到治疗时间表——我们将把它扩大一点,甚至——和我们的脚本。 因此脚本首先创建一个名为 s 的变量。 s 将存储 J 函数的结果。 J 函数创建一个矩阵,该矩阵具有一些指定的行数、指定的列数和一些起始值。 在这种情况下,我使用的是不带参数的 Nrow 函数。 所以它只是要查看当前数据表中的行数。 所以我将运行 line 你可以在日志中看到现在存储在 s 中的是这个零列向量。 我将使用它来添加每个固化时间值。 所以我正在使用 for 循环。 我初始化 c 等于因为使用固化时间数据,我想从第二列开始。 我测试 c 是否小于或等于列数。 再一次,最佳实践是,特别是如果您可能正在使用更大的数据表,在 for 循环之外执行此计数,将其存储在变量中,并将 c 与该变量进行比较。 接下来解析器评估 for 循环的主体。 因此,我们首先看一下assign 函数的右侧。 所以我第一次将消息 get 作为矩阵发送到列,然后将其添加到 s. 然后我们用后增量运算符更新 c。 这样就在 c 中添加了一个。 我们测试以确保 c 仍然小于或等于列数。 现在我们将 column 作为矩阵并将其添加到 s. 因此,我将继续运行并记住 for 函数将缺失值返回到日志中。 但是您可以将鼠标悬停在 s 上以查看它现在包含这些相当大的数字,即所有五个固化时间列的总和。 最后,我将向当前数据表发送一条消息,即新列消息。 新列的标题将是平均。 对于值——同样,这可以是设定值或值——我实际上要进行计算。 同样,我可以为 values 参数提供函数,而无需先创建变量来存储这些函数。 所以这里的函数——我有一个除法函数和一个减法函数。 我正在取 s,它是治疗时间列的总和,我将它除以 c 减它是 c 减,因为我们开始计算 c向上。 当然,c 必须通过测试递增。 它必须通过测试。 所以 c 的最终值——我可以悬停并看到那是然而,我们实际上只是添加了一些东西。 所以这就是我们除以 c 减的原因 所以我将继续运行最后一行。 您可以看到在固化时间数据表中创建了平均列。 并且在日志中指出,可以看到我已经创建了一个列对象的实例。 事实上,如果我想继续更多地使用该列,则可以将结果中的所有内容分配给一个变量。 现在,对于演示的下一步,我想一次处理所有的 Cure Time 数据,执行计算。 因此,我将把整个数据表提取为一个矩阵,而不是一次提取一列,就像我在这个预先编写的脚本中所做的那样。 在我这样做之前,我想摆脱我刚刚创建的那个专栏。 所以我要选择这个脚本编辑器窗口的全部内容。 我将向当前数据表发送一条消息。 删除列。 我要删除的列是名为“平均值”的列。 我要再次指出,当您进行测试或我正在演示时,使用当前数据表非常方便。 在生产类型的脚本中,我们真的希望对我们的表使用更明确的引用。 因此,当您练习脚本时,当前的数据表很好,只是测试以了解某些东西是如何工作的。 但在实践中,如果您计划部署或使用脚本并希望在 JMP 的多个版本以及您使用它的多种情况下进行维护,我们将希望使用该显式数据表引用而不是当前数据表。 所以我要继续运行它。 这删除了我想删除的列。 将该可编写脚本的消息返回到日志。 所以现在让我清除脚本编辑器窗口的内容。 我将把整个数据表提取为一个矩阵并将其存储在变量 m 中。 所以m会被赋值给当前数据表发送消息的结果。 该消息以矩阵形式获取。 所以我会运行它。 你可以在日志中看到,或者你可以将鼠标悬停在 m 上,我现在已经有了这个矩阵。 第一列是这些非常巨大的数字。 当然,这是因为当我一般将 get 作为矩阵发送到数据表时,它会提取所有数字列。 这将包括日期。 所以这里的一天被视为数字。 您可以通过建模类型图标来判断,因为它是连续的。 数据类型必须是数字。 你实际上也可以——如果我把它做得更宽——即使 day 中似乎有字符,那只是格式化。 所以这是正确的,因为它是一个数字。 所以 get as 矩阵也提取了该值。 如果我想在 Cure Time 上进行计算——事实上,我想做的计算将涉及找到最小值和最大值——我不希望该矩阵中当天的这些大值。 所以我要去一个新的行。 我会小心的。 我想保留我已经拥有的东西——我已经放在窗口中的代码在我浏览这个时是可见的,但我不想把整个事情都重新运行一遍。 所以我会非常小心地一次运行一条线路。 为了摆脱第一列,我将使用变量 m 并用一个零和一个下标它。 如果你还记得,下标只是意味着,不要选择任何特定的行。 换句话说,给我第一列的所有行。 我将分配空矩阵,它只是方括号,其中没有任何内容。 同样,为了只运行那一行,我可以突出显示该行并使用我们用来运行整个脚本的任何方法。 但它只会运行选定或突出显示的部分。 或者在标准桌面键盘的数字小键盘上,我可以使用最右侧的 Enter 键。 所以返回到日志的只是空矩阵。 但是,如果我现在将鼠标悬停在 m 上,或者如果我突出显示 m 并运行它,您会看到我们现在只有 Cure Time 值。 我们已经删除了包含那些大日期数字的第一列。 我将换行,看看我们可以使用的其他一些矩阵函数。 因此,我将创建一个变量 a,它将分配使用 loc 函数 LOC 的结果。 我将在这个矩阵 m 中找到值大于的位置 当我只运行那条线时,我们正在处理矩阵 m,就好像它是一个行向量并从第一个开始计数位置并只返回矩阵中所有大于的元素的位置,即单下标位置 现在,如果我想要实际值,我将创建一个名为 avals 的变量。 我将用变量 a 对存储在 m 中的矩阵的下标结果进行签名。 我将只运行那条线。 还有实际的固化时间值超过了当然,为了简化这个脚本,如果我不需要存储所有这些值的位置,我实际上可以简单地下标——让我复制这个——下标具有 loc 函数的矩阵 m。 我不需要存储位置然后使用它的这个额外步骤,除非我有其他原因来处理我最初存储在此示例中的位置。 所以接下来我要对这个矩阵做的就是计算一些转换后的值。 Ans 这种转换将每次观察到的固化时间减去整个表中的最小值除以最大到最小固化时间值的范围并将其乘以所以这有点像每次观察到的距离最小固化时间作为范围的比例。 这说明了使用矩阵的另一个优势。 为了在整个数据表中找到最小值,无论我是在编写脚本还是以交互方式工作,使用数据表中的各个列都需要很多步骤才能找到最小值或最大值。 但是使用矩阵,我可以用很短的一行代码来完成。 所以在我的脚本编辑器窗口中——让我现在继续清除内容——我将创建一个变量 minCT——所以最小固化时间,我将分配给该变量使用的结果以 m 为参数的 min 函数。 我会继续运行这条线。 所以最小值是 然后我还要创建一个变量 maxCT。 我将分配给它使用 max 函数并以 m 作为参数的结果。 我将只运行那条线。 这就是现在我可以在计算这种转换时使用这些变量。 我将创建一个变量 t 来存储变换值。 让我换一个新路线。 因此 t 将被分配时间的结果,然后为分子 m 减去 minCT 的左括号 右括号为除号,然后为分母 maxCT 减去 minCT 的左括号。 所以我可以只运行那条线,然后得到这些变换值。 每个观察值减去最小值作为固化时间值范围的一部分。 现在,这是很多小数位。 我们真的没有那么精确。 所以我们实际上可以对这些值进行四舍五入。 我会再去一个新的线路。 我将通过将 round 函数的结果分配回 t 来覆盖 t 中的值。 如果您想保留原始变量,可以在新变量中执行此操作。 但我要输入 t 然后是赋值运算符,即轮函数。 论据是第一,我在四舍五入? 所以我正在四舍五入存储在 t 中的值。 然后我想要多少个小数位? 我要零。 现在,这将截断矩阵中的值。 这与将数据列格式化为只有零个小数位(其中完整值仍存储在后台)不同。 所以我不在这里格式化。 我实际上是在截断这些值。 我会继续运行它。 现在我得到了转换后的值的整数值。 现在,如果您想将这些值放回固化时间数据表中,您可以遍历矩阵并创建新列。 如果我只想完全创建一个新的数据表,有一个非常简单的函数叫做 table。 并且有用于命名此表和命名列的可选参数。 我将通过使用变量 t 作为 as 表的参数来简化此演示。 当我运行它时,我得到了这个带有通用列名的无标题表。 但是该表中填充了来自该变换矩阵的所有这些值。 同样,我可以将名称和列标题指定为 as table 参数的一部分。 或者我可以在事后使用脚本来修改它。 因此,我们研究了从数据表中提取数值的几种不同方法,按列或整个数据表、所有数值列、整个数据表,以及我们可以对矩阵进行的一些操作。