我经常从 JMP 用户那里听到,他们希望使用新数据更新数据表,而不是创建一个全新的数据表。 这可能有多种原因:您可能已经完成了一些数据清理或重新编码,希望将您的工作和之前的分析保存到数据表中,或者您只是需要将新数据添加到现有数据表中。
在第1部分在这个两篇文章系列中,我讨论了第一个场景 - 电子表格中的垂直结构化数据。 这并不太复杂,导入新数据并将其连接到原始数据(考虑已导入的行)。
今天我想讲的是第二种情况,这个情况比较复杂一些。 在查看来自实验室等客户的数据时,我经常看到这种情况。 水平结构化数据表:

即第一行/第一列是参数名称,后面的列是数据。 第二行是单位,第三行是批次号。 然后是一个空行,之后对于另一个参数再次执行相同的操作。 这在电子表格中更容易阅读,但最终不太容易分析。 我经常看到这类数据,尽管训练人们以垂直方式输入数据比尝试使用水平结构要好得多。
如何在 JMP 中导入和更新这样的表? 这些数据有什么困难?
我们必须了解挑战。
- 首先,数据按行排列,但更大的挑战是有多行显示相似的信息。 参数(P1、P2、P3)、单位和每个参数重复的相同批次号
- 其次,我们用空行来划分数据,以便于解释什么属于什么
对于数据分析,机器不会喜欢这种结构,您需要具体告知数据所在的位置并进行适当的分析。 如果右侧添加了新数据,则需要适当调整分析的数据范围。
由于这些挑战,我们需要在达到我们想要的目标之前处理数据。
让我们开始创建我们要更新的模板表
1. 按原样访问电子表格中的当前数据:

2.这实际上不是我们想要的表,所以我们将其重命名为“help”,并需要删除空行,作为转置数据的准备,在编码中可以如下所示:
dt_h1 << Set Name( name_worksheet || "help" );
// Remove rows with only missing values (break lines between measurements)
n = Loc( Column( 1 ) << Get Values, "" );
dt_h1 << Select Rows( n );
dt_h1 << Delete Rows;
- 注意:我使用了非常有用的 LOC 命令来定位要删除的空行
3. 第一列包含我们希望在最终数据中包含的实际列名称。 我们想保存它们以供以后使用。 然后我们可以转置表格,为其提供最终的表格名称(作为工作表 - 因为我将参考表格名称来自动在电子表格中找到相应的工作表):
// Get names used for column names after transposing the data table
NewNames = dt_h1:Column 1 << Get Values;
// Transpose Column
dt_final = Data Table( name_worksheet || "help" ) << Transpose(
columns( 1 :: N Cols( dt_h1 ) ),
Label column name( "ColName" ),
Output Table( name_worksheet )
);

4.我们现在需要对数据表进行一些更改:
- 删除第一列
- 删除第一行
- 更改列名称
- 最后设置正确的数据和建模类型(由于第一行已全部设置为字符),并保存文件
- 对于此示例,还删除最后两行,以便我们可以测试更新脚本,而无需向电子表格添加列
- 注意:根据系统的本地化设置以及 Office 语言,在更改数据和建模类型之前,您可能需要先处理 JMP 中的首选项设置或小数点/逗号(例如,使用重新编码)
最终的表应该是这样的:

现在让我们处理更新脚本
您需要的大部分内容已经完成并自动保存到脚本中:
- 导入源脚本
- 转置源脚本
- 上面提到的一些操作以及脚本示例
让我们看一下我们将作为脚本放入此模板表中的最终更新脚本:
1.导入当前数据表名称的工作表
// Read in Sheet2 of the Excel workbook
excelFile = "TransposedExcelWorksheet.xlsx";
// Get the name of the data table and number of existing rows
cdt = Current Data Table();
cdtName = cdt << get name();
n_Rows = N Rows();
// Import the data invisible
dt_h1 = Open(
excelFile,
Worksheets( cdtName ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 0 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 1 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
),Invisible
);
2.对模板表进行上述修改,转置并清理数据表
dt_h1 << Set Name( cdtName || "help" );
// Remove rows with only missing values (break lines between measurements)
n = Loc( Column( 1 ) << Get Values, "" );
dt_h1 << Select Rows( n );
dt_h1 << Delete Rows;
// Get names used for column names after transposing the data table
NewNames = dt_h1:Column 1 << Get Values;
// Transpose Column
dt_final = Data Table( cdtName || "help" ) << Transpose(
columns( 1 :: N Cols( dt_h1 ) ),
Label column name( "ColName" ),
Output Table( cdtName )
);
// Clean up data table - delete first row of column names and first column (labels)
dt_final << Select Rows( 1 );
dt_final << Delete Rows();
Column( dt_final, "ColName" ) << Set Selected;
dt_final << Delete Columns();
// Set the Column Names appropriately based on deleted first row in this table
For( i = 1, i <= N Cols( dt_final ), i++,
col = Column( i );
col << Set Name( NewNames[i] );
);
3. 删除已导入的行,并使用连接将其余行附加到原始数据表:
// remove rows already imported
dt_final << Select Rows( 1 :: n_Rows );
dt_final << Delete Rows();
// Append new data to original data table
cdt << Concatenate( dt_final, Append to first table );
// Close help data table
Close( dt_final );
Close( dt_h1 );<BR />
// this last bracket is to close the whole script!
);
- 注意:您不必关心数据和建模类型,因为 JMP 已经知道如何根据现有列属性处理数据。
将此脚本添加到模板数据表中后,您只需按一个按钮即可从电子表格中的水平结构化数据中获取新数据。
结论
这涉及很多步骤,有些很容易做到,有些则更高级。 好处是您可以在 JMP 中完成此操作。 但是,请永远记住:
数据准备是从数据中提取见解最需要时间的部分!
如果您想处理数据,请使用为数据分析量身定制的结构。
这在大多数情况下是一种垂直方法,其中每一列代表一个参数。 但也可以采用基于行的方法,但请采用正确的方法。
举两个例子,方便分析:


- 注意:为参数名称添加新列可以消除重新排列导入数据的负担。 并且您有一个分组变量,可以在分析平台中用作叠加或按组使用。 这避免了对每列运行相同的分析,而是立即进行。
当然,您可以使用它并通过向数据添加分析来扩展它,例如更新控制图或其他趋势分析。 使用 Windows Scheduler,您可能需要更新您的报告并将其发送到我们的新产品JMP 直播,因此其他人(不一定是获得许可的 JMP 用户)可以通过 JMP 的交互性(如数据过滤器、列切换器等)在 Web 浏览器中访问报表。
请随意添加您的用例和/或方法来执行类似的操作。 我很高兴看一看。
一切顺利,
马丁
PS:对文件的三条评论:
- 在 Sheet2.jmp 中,您将找到一个用于使用附加的 Excel 文件更新数据表的脚本。 两个文件必须保存在同一文件夹中(这是为了简单起见,您可以使用 Pick File() 轻松更改硬编码的文件名,并提取名称。
- 第二个脚本是“删除最后两行”,它允许删除数据表中的行以从 Excel 工作表中再次更新,而无需手动删除这些行。 所以一切都是为了您的方便
- ScriptUpdateHorizontal.jsl 将使用更新脚本创建初始源表,并删除添加到数据表中的最后 2 行脚本。 该脚本还引用了博客的第一部分,因此您可以继续进行。