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