ループ?複数の列および分析 (日付) ごとに名前が変わる列名を使用して、作業から欠落したデータをカウントします。質問があるのですが、このコミュニティが解決してくれることを願っています。 最終日以降の連続した欠落日数を示す列を追加したいと考えています。
また、7 つの列から結果が 0.02 を超えた日をカウントする列を追加したいと考えています。
一連の if ステートメントを使用して両方の解決策を見つけましたが、おそらくループを使用して、よりエレガントな方法で実行できるかどうかを知りたいと考えています。
最後に、テーブル内の日付は週ごとに変化するため、この式を列名から独立させたいと考えています。 これは可能でしょうか?
同様のデータテーブルとソリューションを添付しました。
よろしくお願いします
/マルク
高度な統計モデリングデータのブレンディングとクリーンアップマスカスタマイゼーション結果の共有と伝達Re: ループしますか?複数の列および分析 (日付) ごとに名前が変わる列名を使用して、作業から欠落したデータをカウントします。私の解決策はおそらく必要以上に少し複雑です (example_new テーブルの作成に添付された完全なスクリプト)。 このソリューションでは、対象の列の名前が「Max(something」であることを想定しています (また、「Max(」列が 7 つを超えている場合でも機能するはずです)。
これら両方の数式列は、データ変更時に再計算する機能を失うため、データテーブルのデータが変更された場合は、テーブルの赤い三角印から「手動で」再計算する必要があります。

列の式:
//modified idea based on of @txnelson solution
tempCol = dt << New Column("# last days missing_community", Numeric, Nominal,
Formula(
Local({
//get information on column names
dt = Current Data Table(),
colNames = dt << Get Column Names(String)
},
//get list of column names with only Max( in name
For(i = N Items(colNames), i > 0, i--,
If(!Contains(colNames[i], "Max("),
Remove From(colNames, i);
)
);
//get values on rows
//this might make a mistake if columns before Max( have are missing values
matLength = N Items(colNames) + 1;
rowValues = dt[Row(), 0][1::matLength];
count = 0;
//calculate missing values from the end of matrix and stop on first found value
While(Is Missing(rowValues[matLength]), count++; matLength--);
count;
)
)
);
dt << New Column("#days higher than 0,02_community", Numeric, Nominal,
Formula(
Local({
//get information on column names
dt = Current Data Table(),
colNames = dt << Get Column Names(String)
},
//get values on row and set values of colums without Max( in name to 0
rowVals = dt[Row(), 0];
For(i = N Items(colNames), i > 0, i--,
If(!Contains(colNames[i], "Max("),
rowVals[i] = 0;
)
);
//create matrix with 0 and 1 based on if value is over 0.02
rowVals_over = rowVals > 0.02;
//get sum of previous matris to calculate Max( columns with values over 0.02
Sum(rowVals_over);
);
)
);
Re: ループしますか?複数の列および分析 (日付) ごとに名前が変わる列名を使用して、作業から欠落したデータをカウントします。親愛なる@マルク、
また、動的スクリプトを作成して列の数式に解析するのにも苦労しています。 過去に私はあなたと同様の状況を経験しました。そこでは、繰り返される測定(あなたの場合、バッチは毎日繰り返されます)の数が、ある観測(バッチ)から別の観測(バッチ)に変わる可能性があります。
私のソリューションはあなたのニーズに対して少し荒いように見えるかもしれませんが、うまくいくはずです。
使用する前に、さまざまなシナリオに耐えられるかどうかを確認してください。
データテーブルを開いた状態でこのスクリプトを実行し、結果を調べます。
Names Default To Here( 1 );
dt = Current Data Table();
// get list of columns
Cols = dt << get column names ( Continuous );
maxlist = {};
For( i = 1, i <= N Items( cols ), i++,
If( Contains( cols[i], "Max" ),
Insert Into( maxlist, cols[i] )
)
);
dt2 = dt << Stack(
columns(maxlist ),
Source Label Column( "Time" ),
Stacked Data Column( "Data" )
);
dt2 << Sort(
By( :Batch#, :Time ),
Order( Ascending, Descending ),
replace table
);
dt2 <<NEW column=""> :Index2 ) << delete rows ();
dt3 = dt2 << Summary(
Group( :Batch# ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 ),
);
close (dt2, no save);
dt3:N Rows << set name ("No of last days missing");
dt << new column ("No of last days missing", set each value (0));
dt << Update(
With( dt3 ),
Match Columns( :Batch# = :Batch# )
);
close (dt3, no save);
//
dt5 = dt << Stack(
columns(maxlist ),
Source Label Column( "Time" ),
Stacked Data Column( "Data" )
);
dt5 << select where (ismissing (:Data)) << delete rows;
dt5 << select where (:Data<=0.02) << delete rows;
dt6 = dt5 << Summary(
Group( :Batch# ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
close (dt5, no save);
dt6:N Rows << set name ("Days over 0.02");
dt << new column("Days over 0.02", set each value(0));
dt<< Update(
With( dt6 ),
Match Columns( :Batch# = :Batch# )
);
close (dt6, no save);
<BR /></NEW>
うまくいくかどうかお知らせください。
ロン
Re: ループしますか?複数の列および分析 (日付) ごとに名前が変わる列名を使用して、作業から欠落したデータをカウントします。これが私が思いついた代替公式です
If( Row() == 1,
start = 2;
end = 8;
);
count = end;
While( Is Missing( Column( count )[Row()] ) == 1 & count >= start, count-- );
end - count;