안녕하십니까,
열에 아래와 같은 단어가 오는 ID 번호가 있는 큰 데이터 테이블이 있습니다.
| 1-날짜 | 1-매개변수 | 1-무언가 | 2-something | 2-날짜 | 2-매개변수 | 3-매개변수 | 3-날짜 | 쓰리썸 | 3-기타 |
| | | | | | | | | | |
| | | | | | | | | | |
내 궁극적인 목표는 샘플 레이블로 날짜를 사용하여 관리도를 자동화하는 것입니다. 각 ID에 대해 균일한 양의 열이 없으며 날짜 오름차순으로 정렬되지 않습니다.
내 아이디어는 큰 데이터 테이블을 ID별로 더 작은 테이블로 분할한 다음 그 테이블에서 차트를 제어하는 것입니다. 그러나 자동화된 방식으로 이 분할을 수행하는 방법을 모르겠습니다.
감사
Jim의 솔루션은 테이블에 규칙적인 열 패턴이 없는 경우 내가 언급한 보다 일반적인 솔루션입니다. Jum의 응답은 내가 Post를 누른 후에야 나타났습니다.
찰스,
열에 일반 시리즈 3( 날짜, 매개변수 이름, 데이터 값)이 있는 경우 메인 메뉴 > 테이블 > 스택을 사용하여 UI를 통해 수행할 수 있으며 여러 시리즈 스택을 선택하고 행별로 스택을 선택 취소합니다.열 이름을 약간 정리해야 하지만 결과 테이블은 매개변수 이름 또는 데이터 그룹을 기준 변수로 사용하는 제어 차트에 사용할 수 있습니다.
또는 별도의 테이블을 원하면 이 새 테이블에서 테이블 하위 집합을 사용하고 하위 집합 기준을 선택한 다음 데이터 그룹을 지정할 수 있습니다.
테이블에 반복되는 시리즈 순서가 없으면 각 그룹의 하위 집합을 지정하는 데 스크립트나 많은 수동 작업이 필요합니다. 데이터 테이블의 열 순서가 불규칙한 경우 이 게시물에 응답하세요.
반복되는 시리즈 열이 있고 모든 날짜와 모든 것이 동일한 모델링 유형(숫자, 연속형)인 경우 테이블에서 작동해야 하는 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 가지 방법을 봅니다.첫 번째는 다른 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 || ");"
)
)
)
);
그런 다음 listOfID를 반복하고 처리를 수행할 수 있습니다.
다른 방법은 모든 열을 쌓은 다음 ID에 대한 새 열을 만들고 레이블에서 ID 값을 제거한 다음 열을 다시 일반 열로 분할하고 By 문을 사용하여 처리를 수행하여 구분합니다. 다른 아이디.같은 것
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
);
이제 설명을 하자면.......내가 말했듯이, 귀하의 희소한 세부 정보를 사용하여 이에 대해 많은 추측을 하고 있습니다.또한 샘플 데이터 테이블이 없으면 내가 제공한 코드가 테스트되지 않았으며 첫 번째 실행에서는 작동하지 않을 것이라고 가정합니다.문제를 해결하기 위해 취할 수 있는 가능한 방향을 제시하기 위한 것입니다.