53 個の時間列があり、一部は空で一部は入力されています。入力された最も高い列が次に入力された列よりも大きいことを保証する数式をどのように記述すればよいですか。行が数百ある場合、各行は個別の作業チケットであり、各行には最大 53 個の時間列を入力できますが、ほとんどの行では一部の列のみが入力され、その間の列は空白になっています。
たとえば、行 1 の場合、列 1 があり、列 23 と列 36 だけがタイムスタンプを含む列であるため、36>23 および 23>1 であることを知っておく必要があります。
行 2 ではすべての列にタイムスタンプがあるため、[53>52,............,2>1] であることを知る必要があります。
ありがとう
フィオナ
高度な統計モデリング消費者および市場調査Re: 53 時間の列、一部が空で一部が塗りつぶされています。 最高の塗りつぶされた列が次の塗りつぶされた列よりも>であることを保証する式をどのように書くのですか?ヤルモ、
これも非常にうまく機能します。
私はマトリックスをあまり使っていませんが、面白そうです。 私はそれを調べて、それを理解していることを確認する必要があります.
ありがとう
Re: 53 時間の列、一部が空で一部が塗りつぶされています。 最高の塗りつぶされた列が次の塗りつぶされた列よりも>であることを保証する式をどのように書くのですか?マトリックスを使用した解決策の 1 つを次に示します。列名に関する情報が必要ない場合は、result_column とそれに関連する計算を削除して短くすることができます。
Names Default To Here(1);
dt = Current Data Table();
result_flag = [];
result_column = {};
For Each Row(dt,
m_all = dt[Row(), 0]; //get all values of row to matrix
m_values = m_all[Loc(m_all)]; //remove missing values;
start = Insert(m_values[1::N Items(m_values)-1], 0, 1); //shift right by 0 and remove last value
end = m_values;
//if we only want to know if any value is smaller than previous, we can just us any
Insert Into(result_flag, Any(end - start < 0)); //we could stop here if we don't want to know the column name
//but that doesn't tell us which column(s) breaks the "rule"
idx = Loc(end - start < 0); //indices of value matrix which break the rule -> will require checking for empty
If(N Items(idx) == 0,
Insert Into(result_column, "");
, //else
breaking_col = Min(Loc(m_all, m_values[Min(idx)])); //values which break rule, we can most likely just get the first index?
Insert Into(result_column, Column(dt, breaking_col) << get name);
);
);
dt << New Column("Flag", Numeric, Nominal, Values(result_flag));
dt << New Column("Column_Flag", Character, Nominal, Values(result_column));式としても使用される可能性が最も高いですが、かなり簡単に破れるため、お勧めしません。
dt << New Column("Formula_Flag", Numeric, Nominal, Formula(
dt = Current Data Table();
m_all = Matrix(dt[Row(), 0]);
m_values = m_all[Loc(m_all)];
start = Insert(m_values[Index(1, N Items(m_values) - 1)], 0, 1);
end = m_values;
Any(end - start < 0);
));
Re: 53 時間の列、一部が空で一部が塗りつぶされています。 最高の塗りつぶされた列が次の塗りつぶされた列よりも>であることを保証する式をどのように書くのですか?これは素晴らしいです。条件が正しくない場所を正確に教えてくれるので、私が求めていたものよりもさらに優れています。
ありがとう!
Re: 53 時間の列、一部が空で一部が塗りつぶされています。 最高の塗りつぶされた列が次の塗りつぶされた列よりも>であることを保証する式をどのように書くのですか?これがあなたが望むものかどうかは正確にはわかりませんが、以下のスクリプトは列全体をスキャンし、すべての日付値が前の日付から増加していることを確認します.そうでない場合は、前の日付より前の日付を検出した列の名前を配置します。
Names Default To Here( 1 );
dt = Current Data Table();
If( Try( dt:flag << get name, "" ) == "",
dt << New Column( "Flag", Character )
);
For( rowNum = 1, rowNum <= N Rows( dt ), rowNum++,
For( startCol = 1, startCol <= N Cols( dt ), startCol++,
If( Is Missing( Column( startCol )[rowNum] ) == 0,
holdVal = Column( startCol )[rowNum];
Break();
)
);
For( col = startCol + 1, col <= N Cols( dt ) - 1, col++,
If( Is Missing( Column( Col )[rowNum] ) == 0,
If( Column( Col )[rowNum] < holdVal,
dt:Flag[rowNum] = (Column( Col )) << get name;
holdVal = Column( col )[rowNum];
Break();
,
holdVal = Column( Col )[rowNum]
)
)
);
);Re: 53 時間の列、一部が空で一部が塗りつぶされています。 最高の塗りつぶされた列が次の塗りつぶされた列よりも>であることを保証する式をどのように書くのですか?明確にするために。それらはすべて正しいはずなので、上記が当てはまらない行の最後に「1」を表示するフラグ列を作成するのが最も簡単な方法だと思います。