选择和子集数据因此,在本演示中,我们将着眼于选择特定行并使用子集命令(可在 Tables 菜单中以交互方式找到)来提取数据表的子集。 因此,在课程日志部分中,我将单击滑雪小屋温度数据。 这是一个广泛的数据表,但相当短。 所以我们这里的场景是我们有一个有气象站的滑雪胜地,它每小时记录一次温度并将其保存到某个文件中。 因此,文件中的每个观察结果都将包含每小时温度读数的日期加上。 它在上午统计,上午的温度也是如此。现在让我们假设当温度低于零摄氏度时,我们计划打开造雪机,因为在那个温度下可能太冷而不能下雪。 因此,我们想查看我们的历史数据记录,找出记录中我们使用那台造雪机的日子。 也许我们正试图证明添加另一台机器或替换现有机器的合理性。 这里有几件事。 一个是这个温度是用华氏温度记录的,而不是摄氏温度。 第二,我们只使用了一小部分数据。 现在这些都是按天排序的,但这代表了我们的最佳实践之一,当您将要处理大型数据集时,请尝试获取具有代表性的观察样本来开发您的脚本,以便您可以开发和测试您的脚本针对较小的子集。 同样,希望能代表您可能希望在数据中找到的任何问题。 然后您可以针对完整的数据集对其进行测试。 所以在这个例子中,希望这是有代表性的,我们只用了一周的数据。 另一件事是我们记录了华氏温度,但我们的截止温度是零摄氏度。 因此,虽然我们当然可以将负摄氏度转换为华氏温度,但我们将重申这个使用矢量化操作的概念,我们将提取所有华氏温度作为矩阵并将它们转换为摄氏温度。 所以在日记里有一个预先写好的脚本,叫做隔离造雪日脚本。 我将一次运行那件作品。 在这个演示中,我实际上将使用嵌入式日志选项,而不是来回导航到日志窗口。 所以我要在我的脚本编辑器窗口中右击并选择 Show Embedded Log。 我将调整它的大小,以便我们仍然可以在窗口的编辑器部分中看到整个脚本。 所以我会选择行并运行它。 这样就可以获取当前数据表的引用,即 Ski Lodge 温度数据表,并将其存储在 dt 中。 然后我将消息 get 作为矩阵发送并将其存储在变量 tempF 中。 所以我要运行 line 并且通常使用更大的矩阵,而不是在日志中显示矩阵,我们只获取矩阵维度和已分配的指示。 现在注意它有七行和七列。 如果我导航回数据表,则此数据表中有列。 那么为什么我们只拉出列呢? 好吧,如果您查看日期列,一方面您可以看到它是名义上的。 这表明这可能被视为字符数据而不是数字。 而且我可以进一步确认,我当然可以转到列信息,但我还可以通过使列稍微宽一点并注意值左对齐来确认这一点,这就是 JMP 处理字符数据的方式。 所以当我将 get 作为矩阵发送到数据表时,它忽略了这个字符列,只提取了数字列。 然后 Line 将获取变量 tempF 中的每个元素,即存储在那里的矩阵,并将其转换为摄氏度并将其存储在 tempC 中。 我再次在日志中收到相同的消息,但是您当然可以将鼠标悬停在 tempf 或 tempc 上以查看它们的值。 接下来我想计算 tempC 中的行数,我一直提到这是一个最佳实践,在循环外计算行数或列数。 所以我计算矩阵 tempC 中的行并将其存储在变量 nr 中。 所以我会跑线,当然有七个。 我想做的另一件事是我想要——我要创建两个矩阵。 一个给出任何一天的最低温度,即 minTemp,另一个将指示造雪机是否应该打开,称为 Machine。 它们都将从一定数量的行、一列和缺失值开始。 因此,我们正在级联分配函数。 我使用那个 J 函数来制作一个包含一些行数的矩阵,这里是 tempC 中的行数、我提到的那个单列以及缺失值。 如果 Machine 和 minTemp 以及任何其他变量将以相同的值开始,我们可以像您在行中看到的那样以这种级联方式简单地分配它们所以我将运行它,并在日志中,如果您将鼠标悬停在Machine 或 minTemp 你只会看到那一列缺失值。 然后我想循环,我从一个计数器开始,我测试 r 小于或等于存储在 nr 中的数字,然后 for 循环的主体是我将有一个名为 obs 的变量,它将接受这个情况下,tempC 中的第一行和所有列。 我将在该行中找到最小值并将其放在 minTemp 中的第 r 位或第一位。 然后我会将我刚刚放入 minTemp 中的那个位置的值与减号进行比较,如果这个比较为真,如果该值小于减号,我将得到一个布尔值,并将其放在机器的第一个位置,而如果它是假的,如果它大于或等于减号,我会输入机器。 然后我们更新,我们再次测试,现在 obs 将被数据表中的下一行覆盖。 我们将执行相同的步骤,直到我们填充 minTemp 和 Machine。 所以我将运行线路,我们可以将鼠标悬停在 minTemp 上。 它再次显示在悬停帮助中,它也显示在脚本输入窗口的底部,您可以在下面看到。 我可以将鼠标悬停在机器上,有那些,现在最后几个步骤我们可以级联这些消息,但出于演示目的,我们将把它们分开。 所以我要向 dt 发送一个新的列消息。 它将被称为 minTemp,其值将是我刚刚从该 for 循环中获得的值。 因此,我将逐行逐行您可以在后台看到该新列已创建。 例如,我可以在新列中添加一个格式参数以具有固定的小数位数。 这还返回了一个列对象引用,如果我打算再次使用该列,我可以将其存储在一个变量中。 然后下一段代码将新列设置为 dt 的消息。 这个叫作雪。 值来自该机器列向量,它有 和 在这里我的脚本将要求我们使用值标签,如果有一个用于数据值的标签将为否,如果有一个用于数据值的标签将是肯定的。 然后我们当然会使用布尔值来打开使用值标签的选项。 因此,我将运行线条再次,我们正在创建一个列对象的实例。 我想导航回表格并滚动过去。 因此,在现在的列中,我们显示的是“否”和“是”。 在列面板中,如果我向下滚动,您仍然可以看到 Make Snow 是连续的,这意味着它是实际数据值的数字数据。 当我使用值标签时,还有另一件事——列面板中的星号也表示有一个属性,如果你点击它,你会看到这个——当我使用值标签时,如果我将鼠标悬停在数据表中的单元格上,它会显示实际数据值。 但是,如果我现在要制作图表或进行任何类型的分析,只要打开这些标签,它就会使用这些标签。 然后回到脚本中,我们可以再次将这些消息级联到数据表,但出于演示目的,我们将在这些步骤中执行它们。 我将 select where 发送到数据表,我正在寻找 Make Snow 列中的值等于的行 所以我将运行 line 你可以在后台看到已经选择了四行。 最后我将 subsect 命令发送到数据表。 我提供一个输出表名并指定列。 因为我选择了四行,所以我不必说我想要哪些行。 这些将自动被拉入子集表中。 所以我将逐行遍历 现在我们有了那个子集表。 同样在这一点上,我们可以选择格式化最低温度数据。 源脚本反映了子集。 如果我右键单击源并选择编辑,让我们快速看一下。 每当我使用 Tables 菜单中的命令创建新脚本时,无论是交互执行还是使用脚本执行,我都会获得源脚本。 所以它只是显示子集是使用的表命令。 对子集的警告是它不知道为什么这些行被拉出,所以它对这些行进行硬编码。 JMP 编写的脚本中没有该选择的依据。 并且 JMP 还通过将 a 作为参数添加到选定行来覆盖仅拉取选定行的默认趋势。 因此,如果您想捕获脚本并将其调整为您正在编写的另一个脚本,您将希望摆脱我显示的两行,并且在发送子集消息之前,对脚本进行任何逻辑选择需要. 所以我会取消那个脚本。 因此,这是使用表格菜单中的命令的一个示例,但也再次将数据用作矩阵。