使用 JSL 刪除具有一個或多個空值的行<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我有一個表,其中每行包含三個溫度下的單一測量類型,每個測量類型都儲存在自己的列中。 最終,我想計算這些測量值之間的增量,然後將這些數據堆疊到一個新表中。 但是,並非所有測量都是在所有三個溫度下進行的,我需要排除一個或多個數據列為空的那些測量(行)。 我需要使用 JMP 9.0 腳本來執行此操作。
鑑於:
dt分割=
| 測量 | T1 | T2 | T3 |
|---|
| 測量A | 5 | 12 | 89 |
| 測量B | 13 | | 8 |
| 測量C | | 52 | 57 |
| 測量D | 22 | 21 | |
| 測量E | 8 | | |
| 測量F | | | 15 |
| 測量G | | 54 | |
我需要製作:
dtClean =
我試著使用類似的東西:
dtSplit << Select Where(
Is Empty(:T1) ||
Is Empty(:T2) ||
is Empty(:T3)
) << Delete Rows;
但是,任何 SelectWhere(Is Empty(:COL)) 總是選擇所有行。
我確信我錯過了一些簡單的事情,非常感謝您的幫助,謝謝,
- 馬特
回覆:使用 JSL 刪除具有一個或多個空值的行你好
感謝您的意見。 檢查了您推薦的缺失資料模式,它有點有效,但並不完全。
在我的資料表中,每個名字都有 4 個不同的行。 名稱的 4 行中的每一行都是 1 項測試的結果(sens、mask、EVM 和 power)
在我的資料表示例中,設備 A 未通過第一個測試“Sens”,但通過了第二、第三和第四測試。 由於設備 A 未通過“Sens”,因此即使它通過了第二、第三和第四次測試,它也是失敗設備。
如果我使用 Tables==>Missing Data Pattern,則 A 的第 2、3 和 4 行將被刪除。 這不是我想要的。 我想在沒有資料的情況下刪除每個名稱的 4 行(10 MHz、20 MHz、30 MHz 和 1000 MHz 上沒有資料)。 在我的資料表中,名稱C、G、H、I、JK和N將被刪除。
感謝您的協助
回覆:使用 JSL 刪除具有一個或多個空值的行您需要查看缺失資料模式平台形式。它將允許您識別具有所有缺失值的所有行,然後您可以選擇刪除這些行等。
表==>缺失資料模式
回覆:使用 JSL 刪除具有一個或多個空值的行你好
這是我的第一篇文章,不確定附加的 Excel 檔案是否通過。 如果不,
我還附上了範例資料檔的 PNG
我對 JMP 非常陌生(我正在使用 JMP 14),需要有關行刪除腳本的協助。
我的數據表包含許多不同設備的數據,其中每個設備都經過測試
寬頻率範圍內的四種不同故障(靈敏度、模板、EVM 和功率)
從 10 MHz 到 1000 MHz。 通過的設備是所有四個都有空單元格“”的設備
跨頻率範圍進行測試,我想將它們從資料表中刪除。
(刪除附加 Excel 檔案中綠色的行 - 裝置 C、G、H、I、J、K 和 N)
第一個問題:如何刪除空白行(列 10 MHz 到 1000 MHz = 空)
我發現下面的命令類似但沒有用,因為我有 100 個不同的列和“and”
如果我們後來決定增加頻率,它們全部都相當冗長且不可擴展
超過 1000 MHz
dtsplit << 選擇其中(缺失(:T1) | 缺失(:T2) | 缺失(:T3)) << 刪除行;
我也嘗試過這個指令:
對於( i = 2, i <= 101, i++,
dtSplit << select where( Is Missing( Column( i )[] ) ) << 刪除行
);
這個指令給我一個錯誤:
在以下腳本中,錯誤標記為 /*###*/
dt = 當前資料表();
對於( i = 2, i <= 100, i++,
dtSplit/*###*/ <);
第二個問題:刪除的行必須是 4 的倍數,因為每個裝置都被測試了 4 次。
我不太確定該怎麼做
非常感謝您對此的幫助
謝謝
新_2_JMP
回覆:使用 JSL 刪除具有一個或多個空值的行如果您只檢查單一儲存格:
if ( Is Missing( Column( dt,"Value" )[7] ),
dt << delete rows([7]);
);
回覆:使用 JSL 刪除具有一個或多個空值的行您的程式碼僅檢查第 7 行。您需要測試每一行
dt << select where( Is Missing( Column( dt,"weight" )[row()] ) ) << delete rows;
回覆:使用 JSL 刪除具有一個或多個空值的行你好,
我正在嘗試做一些同樣的事情。
我需要檢查單元格是否為空,然後刪除該行(如果是)。
我嘗試了以下方法 -
dt << select where( Is Missing( Column( dt,"Value" )[7] ) ) << 刪除行;
但它會刪除表中的所有行。
尋找想法。
回覆:使用 JSL 刪除具有一個或多個空值的行很棒的討論。 我們遇到了類似的問題,從感測器文件導入時,文件末尾有很多空行。 我們想要刪除沒有感測器資料的行。 但是,不想刪除仍有一些資訊的行。下面是用 JMP14 寫的,但認為它適用於先前的版本。 在 JMP14 中,我知道有“行選擇”>“選擇重複行”。 但找不到類似的函數來對一行中的所有數字列求和。 在下面的腳本中,Sum() 將在矩陣的行中傳回 null,但我想要一個零。 發現 V Sum() 的輸出對於所有 null 都會回傳 0。 為了工作,只需將行向量轉置為列向量。無論您有多少個數字列,只要它們都是空的,這都適用。 如果有人有更好的解決方案仍然感興趣。
dt = Current Data Table();
// Get all numeric data
m = dt << Get As Matrix;
// for each row, test if the V Sum is 0 or non-zero
// V Sum returns 0 for all null
// Sum() returns null for all null
rowlist = {};
For(i= N Rows(m), i>=1,i--,
If(V Sum(Transpose(m[i,0]))[1] == 0,
Insert Into(rowlist,i)
)
);
dt << Delete Rows(rowlist);回覆:使用 JSL 刪除具有一個或多個空值的行使用串聯運算子是一個轉錄錯誤-舊習難改。
事實證明,問題是我的列名,實際上是“88”、“95”和“105”,並使用 Is Missing(:88) 選擇了所有行。
dtsplit << Select Where(Is missing(:Name("T1")) | Is missing(:Name("T2")) | is missing(:Name("T3"))) << Delete Rows;
效果很好。
回覆:使用 JSL 刪除具有一個或多個空值的行您正在使用字串連接運算子 ||而不是 OR 運算子 |。如 MS 所示,您需要使用 Is Missing 函數而不是 Is Empty。你的程式碼變成:
dtsplit << Select Where(Is missing(:T1) | Is missing(:T2) | is missing(:T3)) << Delete Rows;
回覆:使用 JSL 刪除具有一個或多個空值的行抱歉,我錯過了 JMP9 要求。 Loc Nonmissing() 函數似乎是 JMP 10 中的新函數,因此上述函數在 JMP 9 中不起作用。
這是在 JMP 9 中工作的替代方法,與您的程式碼類似,但使用循環。
For( i = 2, i <= 4, i++,
dtSplit << select where( Is Missing( Column( i )[] ) ) << delete rows
);
回覆:使用 JSL 刪除具有一個或多個空值的行這可以透過不同的方式來完成。 對於數字列,矩陣函數通常是有效的。
以下是刪除第 2、3 和 4 列中缺少儲存格的所有行的範例:
keeprows = Loc Nonmissing( dtSplit << get as matrix( {2, 3, 4} ) );
dtSplit << select rows( keeprows ) << invert Row Selection << delete rows;
這是另一種方法,製作不遺失單元格的列子集(保持原始表不變):
dtClean = dtSplit << Clear Column Selection() << subset( rows( Loc Nonmissing( dt << get as matrix( {2, 3, 4} ) ) ) );回覆:使用 JSL 刪除具有一個或多個空值的行該腳本將在標題為「名稱」的列之後開始工作,並繼續刪除表末尾的空白行。
// Get the current data table
dt = Current Data Table();
// Get all column names as strings
cnmes = dt << Get Column Names("string");
// Initialize Start and End indices
Start = .;
End = N Items(cnmes);
// Find the index of the "Device 2" column
For(k = 1, k <= N Items(cnmes), k++,
If(Contains(cnmes[k], "Names"),
Start = k + 1;
Break(); // Exit loop once found
);
);
// Loop through the columns from Start to End and delete rows with missing values
For(i = Start, i <= End, i++,
dt << Select Where(Is Missing(Column(i)[])) << Delete Rows;
);