我經常從 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 行腳本。 該腳本還引用了博客的第一部分,因此您可以繼續進行。