안녕하세요,
다음 기준에 따라 루프를 사용하여 분포를 플롯하려고 합니다.
- 최소 1x 사양 제한(LSL 또는 USL)이 있는 열만 플롯해야 합니다.
- 선택한 열을 인수로 분할해야 합니다(SplitBy).
Eval(EvalExpr())을 사용하여 필요한 표현식을 작성했지만 선택한 열을 기준으로 분할하는 Where() 함수에 어려움을 겪고 있습니다.
실패한 코드 부분을 추출하고 문제가 재현될 수 있도록 처음에 더미 테이블 생성을 추가했습니다.
아래 코드의 문제를 재현하기 위해 주석을 달거나 주석을 제거할 수 있는 3가지 시도 옵션이 있습니다.
내 목표는 아래 옵션 1과 같이 Where()에서 "SplitBy" 변수를 올바르게 호출하는 표현식을 작성하는 것입니다(그러나 ":CONFIG1"은 옵션 1에 하드코딩되어 있습니다).
내 시도 옵션 2와 3(다른 것 중에서...)이 실패했습니다(아래 로그 추출).
Option 1:
dis = dt << Distribution(Continuous Distribution(Column("LogNormal 10,1"n)), Where(:CONFIG1 == “1"))
Option 2:
dis = dt << Distribution(Continuous Distribution(Column("LogNormal 10,1"n)), Where(Column("CONFIG1") == "1"))
This Where-clause for data table 'tabletest.jmp' resulted in no rows: Column( "CONFIG1" ) == "1"
Option 3:
dis = dt << Distribution(Continuous Distribution(Column("LogNormal 10,1"n)), Where(":CONFIG1" == "1"))
This Where-clause for data table 'tabletest.jmp' resulted in no rows: ":CONFIG1" == “1"표현식 평가가 이 포럼에서 반복되는 주제라는 것을 알고 있지만 이를 작동시키려고 많은 시간을 보냈지만 여전히 성공하지 못했습니다.
많은 감사드립니다
설교자
Names Default To Here( 1 );
clear symbols();
Deletesymbols();
//Create table with random distribution
dt = New Table( "tabletest",
Add Rows( 150 ),
New Column( "LogNormal 10,1", Numeric, "Continuous", formula( Random Lognormal( 10, 1 ) ) ),
New Column( "Normal 10,1", Numeric, "Continuous", formula( Random Normal( 10, 1 ) ) ),
New Column( "Gamma 10,1", Numeric, "Continuous", formula( Random Gamma( 10, 1 ) ) ),
New Column( "Normal 10,2", Numeric, "Continuous", formula( Random Gamma( 10, 2 ) ) ),
New Column( "CONFIG1", Character, "Nominal", formula(char(Random Integer( 1, 3 )))),
New Column( "CONFIG2", Character, "Nominal", formula(char(Random Integer( 1, 3 ))));
);
Column( dt, "LogNormal 10,1" ) << set property( "spec limits", {LSL( 0 ), USL( 400000 ), Show Limits( 0 )} );
Column( dt, "Normal 10,1" ) << set property( "spec limits", {LSL( 6 ), USL( 14 ), Show Limits( 0 )} );
Column( dt, "Gamma 10,1" ) << set property( "spec limits", {LSL( 0 ), USL( 40 ), Show Limits( 0 )} );
dt << save( "$Desktop\tabletest.jmp" );
SplitBy = "CONFIG1";
//Get a list from all unique configs
summarize(ColumnSplitBy=by(Column (SplitBy)));
show(ColumnSplitBy);
For( i = N Items( ColumnSplitBy ), i > 0, i--,
If( ColumnSplitBy[i] == "",
Remove From( ColumnSplitBy, i, 1 );
)
);
//Get Column only with limits (At east LSL or USL, I don't care about target)
MetricCols = dt << Get Column Names( numeric, continuous );
Show( MetricCols );
For( i = N Items( MetricCols ), i >= 1, i--,
Q = Column( MetricCols[i] ) << Get Property( "Spec limits" );
Show( Q );
spec_x = Eval List( {Arg( Q, 1 )/*, Arg( Q, 2 ), Arg( Q, 3 )*/} );
Show( spec_x );
If( N Row( Loc( spec_x, Empty() ) ),
Remove From( MetricCols, i )
);
);
k=1;
//Loop to run through all configs
For ( j = 1, j <= N Items( ColumnSplitBy ), j++,
Show( j );
//Loop to run Distribution > Fit ALL > Capability and collect the stats
For( i = 1, i <= N Items( MetricCols ), i++,
Show( i );
////////////////////////////////////////////////////// Option 1: That works well, but :CONFIG1 is hardcoded
x = Eval Expr(
dis = dt << Distribution(
Continuous Distribution( Column( Expr(MetricCols[i] ))),
Where(:CONFIG1 == Expr(ColumnSplitBy[j])))
);
print (x);
Eval (x);
/* ////////////////////////////////////////////////////// Option 2 : That doesn't work
x = Eval Expr(
dis = dt << Distribution(
Continuous Distribution( Column( Expr(MetricCols[i] ))),
Where(Expr(Column(SplitBy)) == Expr(ColumnSplitBy[j])))
);
print (x);
Eval (x); */
/* ////////////////////////////////////////////////////// Option 3 : That doesn't work
x = Eval Expr(
dis = dt << Distribution(
Continuous Distribution( Column( Expr(MetricCols[i] ))),
Where(Expr(":"||SplitBy) == Expr(ColumnSplitBy[j])))
);
print (x);
Eval (x); */
);
);나는 이것이 당신에게 효과가 있을 것이라고 믿습니다
x = Eval Expr(
dis = dt << Distribution(
Continuous Distribution( Column( Expr(MetricCols[i] ))),
Where(as column(SplitBy) == Expr(ColumnSplitBy[j])))
);