選擇與同一表中另一列中的條件相符的列的更好方法?這篇文章末尾的腳本基本上做了我想要它做的事情(即,查找時間= 0 時Y 值為100 的列),但它也會產生一條日誌訊息,這讓我有點不舒服(已經踩了之前先陷入陷阱):
A message with an empty Boolean argument enabled an option that was already enabled. That option remains enabled. In previous versions of JMP, this would have disabled the option.
在作為循環構造的一部分被選擇一次之後,此訊息將列印到再次選擇的每一列的日誌中。 作為一個相對較新的腳本編寫新手,我主要擔心兩個問題:
- 我絕對應該避免這條日誌訊息嗎?我會遇到麻煩嗎? 我最終將處理更大的表,因此對於單個腳本執行,此日誌訊息可能會列印數百次。
- 是否有更聰明的方法來尋找表中每行時間 = 0 且 Y 值 = 100 的所有欄位? (就我而言,我將處理包含許多列的表,其中一些列包含在時間 =0 時標準化為 100% 相對值的結果。 這些是我感興趣的專欄。)
Names Default To Here( 1 );
// table required for example
dt = New Table( "Results (absolute & relative) vs time",
Add Rows( 8 ),
New Column( "time",
Numeric,
Set Values( [0, 1, 2, 3, 0, 1, 2, 3] ),
),
New Column( "Y1_absolute",
Numeric,
Set Values( [7, 8, 1, 9, 0.2, 0.4, 0.65, 0.98] ),
),
New Column( "Y1-relative",
Numeric,
Set Values( [100, 114, 14, 129, 100, 200, 325, 490] ),
),
New Column( "Y2_absolute",
Numeric,
Set Values( [12, 6, 4, 0, 80, 90, 120, 75] ),
),
New Column( "Y2_relative",
Numeric,
Set Values( [100, 50, 33, 0, 100, 113, 150, 94] ),
)
);
// selecting columns where for :time == 0 a Y-value == 100 is found
For( i = 1, i <= N Row( dt ), i++,
For( j = 1, j <= N Col( dt ), j++,
If( Column( j )[i] == 0,
For( k = 1, k <= N Col( dt ), k++,
If( Column( k )[i] == 100,
Column( k ) << Set Selected
)
)
)
)
);
分享和交流成果回覆:選擇與同一表中另一列中的條件相符的列的更好方法?FWIW,這避免了子集表,但可能不會快得多:
Names Default To Here( 1 );
// table required for example
dt = New Table( "Results (absolute & relative) vs time",
Add Rows( 8 ),
New Column( "time",
Numeric,
Set Values( [0, 1, 2, 3, 0, 1, 2, 3] ),
),
New Column( "Y1_absolute",
Numeric,
Set Values( [7, 8, 1, 9, 0.2, 0.4, 0.65, 0.98] ),
),
New Column( "Y1-relative",
Numeric,
Set Values( [100, 114, 14, 129, 100, 200, 325, 490] ),
),
New Column( "Y2_absolute",
Numeric,
Set Values( [12, 6, 4, 0, 80, 90, 120, 75] ),
),
New Column( "Y2_relative",
Numeric,
Set Values( [100, 50, 33, 0, 100, 113, 150, 94] ),
)
);
// Rows that have time = 0
r0 = dt << getRowsWhere(:time == 0);
// Loop over other columns (assumes time is in the first column)
for(c=2, c<=NCol(dt), c++,
if(Contains(Column(dt, c)[r0], 100), Column(dt, c) << setSelected(1));
);
回覆:選擇與同一表中另一列中的條件相符的列的更好方法?再次感謝你。 子集設定確實提高了我真實(大)表的效能。 下面發布了改進的解決方案。 我之前就考慮過這個問題,但顯然需要短暫的休息才能到達那裡。 但我什至沒有考慮到構建列列表並迭代刪除項目。 也謝謝你!
Names Default To Here( 1 );
// new table required for example
dt = New Table( "Results (absolute & relative) vs time",
Add Rows( 8 ),
New Column( "time",
Numeric,
Set Values( [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3] ),
),
New Column( "Y1_absolute",
Numeric,
Set Values( [7, 8, 1, 9, 0.2, 0.4, 0.65, 0.98, 0.7, ., 0.83, 0.4] ),
),
New Column( "Y1-relative",
Numeric,
Set Values( [100, 114, 14, 129, ., 200, 325, 490, 100, 330, 540, 213] ),
),
New Column( "Y2_absolute",
Numeric,
Set Values( [12, 6, 4, 0, 80, 90, 120, 75, 8.3, 9.7, 6.4, 5.2] ),
),
New Column( "Y2_relative",
Numeric,
Set Values( [., 50, 33, 0, 100, 113, 150, 94, 100, 66, 37, 12] ),
)
);
// finding and selecting Y columns where for any :time == 0 a value of 100 is found in the same row
dt << Select Where( dt:time == 0 );
dtTemp = dt << Subset ( Selected Rows, Selected Columns Only( 0 ) );
For( i = 1, i <= N Row( dtTemp ), i++,
For( j = 1, j <= N Col( dtTemp ), j++,
If( Column( dtTemp, j )[i] == 100,
Column( dt, j ) << Set Selected( 1 ),
)
)
);
Close( dtTemp, no save );
dt << Clear Select( );
回覆:選擇與同一表中另一列中的條件相符的列的更好方法?一些想法:
在繼續循環之前,您可以嘗試在 time=0 上對錶進行子集化。 這將解壓縮 for 迴圈的一層。
您可以建立一個列列表並刪除您選擇的列。 然後,對於下一次迭代,您只需循環遍歷剩餘的未選擇的列。
回覆:選擇與同一表中另一列中的條件相符的列的更好方法?非常感激! 我想我會進一步編輯該循環。
- 一旦確定了正確的列,就沒有理由遍歷整個表。 (編輯:以我目前的技能水平來說,這可能有點困難。 不同的 Y 列可能在不同的行中有缺失值。 我需要找到時間 = 0 與一個或多個 Y 值 = 100 相符的所有 Y 列。)
- 為什麼要循環遍歷所有行,而不僅僅是時間實際上為零的行?
編輯:堅持提出的解決方案。 看起來很健壯,不想再花更多時間了。 但第二點,即不循環遍歷表的所有行,是我應該並且可能會在某個時候考慮的問題。
回覆:選擇與同一表中另一列中的條件相符的列的更好方法?在 << set selected 之後新增 (1) 可以處理錯誤訊息。 您不是切換它,而是定義您想要的最終狀態:
For( i = 1, i <= N Row( dt ), i++,
For( j = 1, j <= N Col( dt ), j++,
If( Column( j )[i] == 0,
For( k = 1, k <= N Col( dt ), k++,
If( Column( k )[i] == 100,
Column( k ) << Set Selected(1)
)
)
)
)
);