使用矩陣因此,這個示範將說明使用矩陣的一些方法。 因此,在課程日誌部分中,我將點擊“固化時間數據”。 假設我們需要找到每個日期的平均治癒時間。 因此,我們將每行中的所有固化時間值相加,然後除以樣本數。 我將使用矩陣來執行此計算。 再次強調,那些向量化操作將使其更有效率。 回到課程日誌中,我有一個預先編寫的腳本,名為「使用矩陣計算統計資料」。 讓我移動它,以便我們可以看到固化時間表(我們將使其更寬、更均勻)和我們的腳本。 因此該腳本首先建立一個名為 s 的變數。 s 將儲存 J 函數的結果。 J 函數建立一個具有指定行數、指定列數和起始值的矩陣。 在本例中,我使用不含參數的 Nrow 函數。 所以它只是查看當前數據表中的行數。 所以我將運行 line 你可以在日誌中看到現在儲存在 s 中的是這個由零組成的列向量。 我將用它來添加每個固化時間值。 所以我正在使用 for 循環。 我初始化了 c equals,因為有了固化時間數據,我想從第二列開始。 我測試 c 小於或等於列數。 同樣,最佳實踐是,特別是如果您可能使用較大的資料表,在 for 迴圈之外進行計數,將其儲存在變數中,然後將 c 與該變數進行比較。 接下來,解析器評估 for 迴圈的主體。 所以我們先來看看分配函數的右邊。 因此,我第一次將訊息 get 作為矩陣發送到列,然後將其添加到 s 中。 然後我們用後自增運算子更新 c。 這樣就在 c 中加入了 1。 我們進行測試以確保 c 仍然小於或等於列數。 現在我們將列作為矩陣並將其添加到 s 中。 因此,我將繼續運行並記住 for 函數向日誌傳回一個缺失值。 但您可以將滑鼠懸停在 s 上,查看它現在包含這些相當大的數字,即所有五個固化時間列的總和。 最後,我將向當前資料表發送一條訊息,即新列訊息。 新列的標題將為 Average。 對於值——再說一次,這可以是設定值或值——我實際上要做一個計算。 再次強調,我可以向 value 參數提供函數,而無需先建立變數來儲存這些函數。 所以這裡的函數——我有一個除法函數和一個減法函數。 我取 s,它是固化時間列的總和,我將它除以 c 減 這是除以 c 減,因為我們開始計算 c 所以這會減少我們添加的項目數向上。 當然,c 必須增加通過測試。 它必須通過測試。 所以 c 的最終值——我可以懸停並看到它是 然而,我們實際上只是添加了一些東西。 這就是為什麼我們除以 c 減去所以我將繼續運行最後一行。 您可以看到固化時間資料表中已經建立了 Average 列。 並且在日誌中指出,您可以看到我已經建立了列物件的實例。 事實上,如果我想繼續更多地使用該列,則可以將結果行上的所有內容分配給變數。 現在,對於演示的下一步,我想立即處理所有固化時間數據,執行計算。 因此,我將把整個資料表提取為矩陣,而不是一次提取一列,就像我在這個預先編寫的腳本中所做的那樣。 在此之前,我想刪除我剛剛創建的專欄。 因此,我將選擇此腳本編輯器視窗的全部內容。 我將向當前數據表發送一條訊息。 刪除列。 我要刪除的列是“平均”列。 我想再次指出,當您測試或我進行演示時,使用當前數據表非常方便。 在生產類型的腳本中,我們確實希望對錶使用更明確的引用。 因此,當您練習腳本編寫、只是測試以了解某些內容如何運作時,當前資料表非常有用。 但在實踐中,如果您計劃部署或使用並希望在 JMP 版本和使用它的多種情況下維護腳本,我們希望使用明確資料表引用而不是當前資料表。 所以我要繼續運行這個。 這刪除了我想刪除的列。 將可編寫腳本的訊息傳回日誌。 現在讓我清除腳本編輯器視窗的內容。 我將把整個資料表提取為矩陣並將其儲存在變數 m 中。 所以m會被賦值給目前資料表發送訊息的結果。 該訊息以矩陣形式取得。 所以我會運行它。 您可以在日誌中看到,或者您可以將滑鼠懸停在 m 上,我現在已經得到了這個矩陣。 第一列是這些非常巨大的數字。 當然,這是因為當我將 get 作為矩陣發送到一般資料表時,它將拉出所有數字列。 這將包括日期。 所以這裡的日期被視為數字。 您可以透過建模類型圖示來判斷,因為它是連續的。 資料型別必須是數字。 實際上,你也可以——如果我把它弄寬——即使日期中似乎有字符,那隻是格式化。 所以它是正確的,因為它是一個數字。 因此,也可以透過矩陣提取該值。 如果我想計算固化時間——事實上,我想做的計算將涉及找到最小值和最大值——我不希望在該矩陣中計算當天的這些大值。 所以我要去新的一排。 我會小心的。 我想保留我已經擁有的東西——我已經放在視窗中的程式碼在我執行此操作時可見,但我不想運行整個過程。 所以我會非常小心地一次運行一行。 為了去除第一列,我將使用變數 m 並用零和一作為下標。 如果您還記得的話,下標只是意味著不要選擇任何特定行。 換句話說,給我第一列中的所有行。 我將分配一個空矩陣,它只是方括號,裡面什麼都沒有。 再說一次,為了只運行這一行,我可以突出顯示該行並使用我們用來運行整個腳本的任何方法。 但它只會運行選定或突出顯示的部分。 或者在標準桌上型鍵盤的數位鍵盤上,我可以使用最右側的 Enter 鍵。 所以回到日誌的只是空矩陣。 但是,如果我現在將滑鼠懸停在 m 上,或者突出顯示 m 並運行它,您可以看到我們現在只有固化時間值。 我們已經去掉了帶有大日期數字的第一列。 我將換一個新行,看看我們可以使用的其他一些矩陣函數。 因此,我將建立一個變數 a,它將被指派使用 loc 函數 LOC 的結果。 我將找到這個矩陣 m 中的位置,其中值大於 當我只運行該行時,我們將矩陣 m 視為行向量並從第一個開始計數現在,如果我想要實際值,我將創建一個名為avals 的變數。 我將用變數 a 來標記儲存在 m 中的矩陣的下標結果。 我就跑那條線。 並且實際的固化時間值超過了當然,為了簡化此腳本,如果我不需要存儲所有這些值的位置,我實際上可以簡單地添加下標 - 讓我複製這個 - 下標使用loc 函數計算矩陣m 的值。 我不需要儲存位置然後使用它的額外步驟,除非我有其他原因要處理我最初儲存在本範例中的位置。 所以我想用這個矩陣做的下一件事是計算一些轉換後的值。 回答這個轉換將把每個觀察值的固化時間減去整個表的最小值除以最大到最小固化時間值的範圍,然後乘以所以這有點像計算每個觀察值與最小固化時間的距離時間佔範圍的比例。 這說明了使用矩陣的另一個優點。 為了找到整個資料表中的最小值,無論我是編寫腳本還是互動式工作,處理資料表中的各個列都需要執行許多步驟才能找到最小值或最大值。 但是使用矩陣,我可以用很短的一行程式碼來完成。 因此,在我的腳本編輯器視窗中 - 讓我繼續並現在清除內容 - 我將創建一個變數 minCT - 所以最小固化時間,我將把使用的結果分配給該變數min 函數,以 m 作為參數。 我將繼續運行那條線。 所以最小值是 然後我也會建立一個變數 maxCT。 我將把使用 max 函數(以 m 作為參數)的結果分配給它。 我就跑那條線。 現在我可以在計算此轉換時使用這些變數。 我將建立一個變數 t 來儲存變換值。 讓我換一條新線。 因此 t 會被賦值為時間的結果,然後左括號為分子 m 減去 minCT,右括號為除號,然後左括號為分母,maxCT 減去 minCT。 所以我可以只運行該行,然後獲得這些轉換值。 每個觀察值減去最小值作為固化時間值範圍的比例。 現在,有很多小數位。 我們確實沒有那麼精確。 所以我們實際上可以對這些值進行舍入。 我會再去新的線路。 我將透過將 round 函數的結果指派回 t 來覆寫 t 中的值。 如果您想保留原始變量,可以在新變量中執行此操作。 但我要輸入 t,然後輸入賦值運算符,也就是捨入函數。 爭論首先是,我要捨入什麼? 所以我對 t 中儲存的值進行四捨五入。 那我想要多少位小數呢? 我想要零。 現在,這將截斷矩陣中的值。 這與將資料列格式化為僅具有零位小數不同,其中完整值仍儲存在背景中。 所以我這裡就不格式化了。 我實際上正在截斷這些值。 我會繼續運行它。 現在我已經得到了轉換後的值的整數值。 現在,如果您想將這些值放回固化時間資料表中,您可以循環遍歷矩陣並建立新列。 如果我想完全建立一個新的資料表,有一個非常簡單的函數,稱為 as table。 還有用於命名該表和命名列的可選參數。 我將透過使用變數 t 作為 as table 的參數來使演示變得簡單。 當我運行它時,我得到了這個帶有通用列名稱的無標題表。 但該變換矩陣中的所有這些值都填入在此表中。 再次,我可以指定名稱和列標題作為 as 表參數的一部分。 或者我可以在事後使用腳本來修改它。 因此,我們研究了幾種從資料表中提取數值的不同方法,可以按列提取數值,也可以按整個資料表、所有數值列、整個資料表以及我們可以對矩陣進行的一些操作。