选择和子集数据

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