こんにちは、
列にID番号があり、その後に以下のような単語が続く大きなデータテーブルがあります。
| 1日 | 1パラメータ | 1-何か | 2-何か | 2日 | 2パラメータ | 3パラメータ | 3日 | 3-何か | 3-その他 |
| | | | | | | | | | |
| | | | | | | | | | |
私の最終的な目標は、サンプル ラベルとして Date を使用して管理図を自動化することです。 各 ID の列数は一定ではなく、日付の昇順に並べ替えられていません。
私の考えは、大きなデータ テーブルを ID ごとに小さなテーブルに分割し、それらから管理図を作成することです。 ただし、この分割を自動化する方法がわかりません。
ありがとう
テーブルに列の規則的なパターンがない場合、ジムの解決策は私が言及したより一般的な解決策です。 投稿を押した後にのみ、Jum の応答が表示されました。
チャールズ、
列に通常の 3 つのシリーズ (日付、パラメーター名、データ値) がある場合、これは UI から [メイン メニュー] > [テーブル] > [スタック] を選択し、複数のシリーズ スタック 3 を選択し、行ごとにスタックのチェックを外すことができます。列名を少しクリーンアップする必要がありますが、結果のテーブルは、パラメータ名またはデータ グループを By 変数として使用する管理図に使用できます。
または、個別のテーブルが必要な場合は、この新しいテーブルでテーブル サブセットを使用し、[サブセット別] をオンにしてから、[データ グループ] を指定します。
テーブルにシリーズの順序が繰り返されていない場合は、各グループをサブセット化するためにスクリプトまたは多くの手作業が必要です。 データ テーブルの列の順序が不規則な場合は、この投稿に返信してください。
テーブルに繰り返しシリーズ列があり、すべての日付とすべての何かが同じモデリング タイプ (おそらく数値、連続) である場合に、テーブルで機能する JSL スクリプトを添付しました。
Names Default To Here(1);
dt = current data table();
cnames = dt << get column names("String");
stk = dt << Stack(
columns(
evalList(cnames)
),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
Stack By Row( 0 ),
Number of Series( 3 )
);
stk:Data << Set Name("Date");
stk:Data 2 << Set Name("Parameter Name");
stk:Data 3 << Set Name("Data");
stk:Label << set each value( trim(word(1,:Label,"-")));
stk:Label << Set Name( "Data Group");
stk << delete columns(:Label 2, Label 3);
詳細がなければ、これを解決する方法についておおよその方向性を示すことしかできません。必要なものを追跡する方法は 2 つあります。1 つ目は、さまざまな ID がいくつあるかを調べて、列を ID のさまざまなリストに配置し、次のようにすることです。
Names Default To Here( 1 );
dt = Current Data Table();
colNamesList = dt << get column names( string );
// Create an ID list
listOfIDs = {};
For( i = 1, i <= N Items( colNamesList ), i++,
If( Contains( listOfIDs, Word( 1, Column( dt, colNamesList[i] ) << get name, "-" ) ) == 0,
// Insert into the listOfIDs, the new ID name
Insert Into( listOfIDs, Word( 1, Column( dt, colNamesList[i] ) << get name, "-" ) );
// Create a list to hold the column names for the new ID
Eval( Parse( "listOfColumns_" || Char( N Items( listOfIDs ) ) || " = {};" ) );
Eval(
Parse(
"insert into(listOfColumns_" || Char( N Items( listOfIDs ) ) || "," || Char(
Column( dt, colNamesList[i] ) << get name
) || ");"
)
);
,
// If the ID has already been see, then just add the column name to the
// ID list of column names
Eval(
Parse(
"insert into(listOfColumns_" || Char(
Contains( listOfIDs, Word( 1, Column( dt, colNamesList[i] ) << get name, "-" ) )
) || "," || Char( Column( dt, colNamesList[i] ) ) << get name || ");"
)
)
)
);
その後、listOfIDs をループして処理を行うことができます。
もう 1 つの方法は、すべての列を積み重ねてから、ID の新しい列を作成し、ラベルから ID 値を取り除き、列を共通の列に分割し、By ステートメントを使用して処理を行うことです。異なる ID。何かのようなもの
Names Default To Here( 1 );
dt = Current Data Table();
colNamesList = dt << get column names( string );
// Stack the columns
dtStack = dt << Stack(
columns( colNamesList ),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
Drop All Other Columns( 1 )
);
// Create the ID Column
dtStack << New Column("ID", character,formula( word(1,:label,"-")));
// Now delete the ID from the :Label column
For Each Row(
:Label = trim(substr( :Label, contains(:Label,"-")+1));
);
// Split back to common columns
dtFinal = dtStack << Split(
Split By( :Label ),
Split( :Data ),
Sort by Column Property
);
さて、私の明確化のために......私が述べたように、あなたのまばらな詳細で、私はこれについて多くの推測をしています.また、サンプル データ テーブルがないため、提供したコードはテストされておらず、最初の実行では機能しないと思います。問題を解決するための可能な方向性を示すことを目的としています