同じテーブル内の別の列の条件に一致する列を選択するより良い方法はありますか?この投稿の最後にあるスクリプトは、基本的に私がやりたいこと (つまり、時間 = 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.
このメッセージは、ループ構築の一部として列が一度選択された後、再度選択される列ごとにログに出力されます。 スクリプト作成に比較的慣れていない私には、主に 2 つの懸念があります。
- このログ メッセージは絶対に避けるべきもので、問題が発生するのでしょうか? 最終的にはより大きなテーブルを処理することになるため、このログ メッセージは 1 回のスクリプト実行で何百回も出力される可能性があります。
- 時間 = 0 の各行の Y 値 = 100 を持つテーブル内のすべての列を検索する、より賢い方法はありますか? (私の場合、多くの列を含むテーブルを処理します。その一部には、時刻 =0 で 100% rel. に正規化された結果が含まれています。 これらは私が興味のあるコラムです。)
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
)
)
)
)
);
データ表スクリプト作成Re: 同じテーブル内の別の列の条件に一致する列を選択するより良い方法はありますか?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));
);
Re: 同じテーブル内の別の列の条件に一致する列を選択するより良い方法はありますか?ありがとうございました。 サブセット化により、実際の (大きな) テーブルのパフォーマンスが向上しました。 改善されたソリューションを以下に掲載します。 これについては以前から考えていたのですが、そこに至るまでには明らかに短い休憩が必要でした。 ただし、列のリストを作成し、項目を繰り返し削除することは考慮していませんでした。 それもありがとうございます!
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( );
Re: 同じテーブル内の別の列の条件に一致する列を選択するより良い方法はありますか?いくつかのアイデア:
ループを続行する前に、time=0 でテーブルをサブセット化してみることもできます。 これにより、for ループの 1 つの層が展開されます。
列のリストを作成し、選択した列を削除できます。 その後、次の反復ごとに、残りの選択されていない列をループするだけで済みます。
Re: 同じテーブル内の別の列の条件に一致する列を選択するより良い方法はありますか?とても有難い! そのループをもう少し編集してみようと思います。
- 正しい列が特定されたら、テーブル全体を調べる必要はありません。 (編集: 私の現在のスキルレベルでは少し難しいかもしれません。 異なる Y 列には、異なる行に欠損値がある可能性があります。 time = 0 が 1 つ以上の Y 値 = 100 と一致するすべての Y 列を検索する必要があります。)
- 時間が実際にゼロである行だけでなく、すべての行をループするのはなぜでしょうか?
編集: 提示されたソリューションをそのまま使用しました。 頑丈そうに見えるので、これ以上時間をかけたくありませんでした。 ただし、箇条書き #2、つまりテーブルのすべての行をループしないことについては、いつか検討する必要があり、おそらく検討する予定です。
Re: 同じテーブル内の別の列の条件に一致する列を選択するより良い方法はありますか?<< 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)
)
)
)
)
);