<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />수식에 필요한 변수 수를 알고 있는지 여부에 따라 두 가지 방법을 사용하여 수식 열을 만듭니다.
- Expr과 대용은 읽기 쉽습니다. 코드의 섹션 1은 mean( 바르, 바이바르 )
- 구문 분석 및 eval 및 가능한 경우 eval 삽입은 변수 목록에 의해 설정되는 변수, 번호 및 이름이 필요한 단일 수식 열을 만듭니다.
- 섹션 2a 및 2b는 작동하며 기능적으로 동일합니다.
- 섹션 2c 및 2d는 실행되지 않지만 우아한 솔루션으로 가는 경로로 보입니다.
더 나은 사례를 만들 수 있는 아이디어를 원하고 권장 사항에 감사드립니다.
여기에 기본 이름( 1 );
n=n테이블();
dtnms={};
만약에(
n==0, dtc=1,
n==1, If(current data table() << get name == "Big Class", dtc=0, dtc=1) , // else
for(ii=1, ii <= n, ii++, insert into(dtnms, 데이터 테이블(ii) << getname));
if(contains(dtnms, "빅 클래스") > 0, dtc=1, dtc=0);
);
if (dtc,dt = Open( "$SAMPLE_DATA/Big Class.jmp" ), dt = data table("Big Class"));
// 섹션 1: 변수를 동적으로 입력하는 수식의 여러 열을 추가합니다.
형식1=expr(
form1col=dt << new column(이름, 수식(col mean(As Column(YVar), As Column(ByVar))))
);
VarList={"성별", "신장", "체중"};
For(ii=2, ii <= N 항목(VarList), ii++,
Eval(대체(이름 expr(form1),
expr(Name), VarList[ii]||" 평균",
expr(YVar), VarList[ii],
expr(ByVar), VarList[1],
));
);
// 섹션 2: 변수 목록의 열을 평균화합니다.
// 방법 2a 방법은 작동하지만 디버깅하기 어렵습니다.
VarList={"신장", "체중", "나이"};
Formtxt1 = "formcol = dt << new column(\!"방법 a: 평균\!", 공식(평균( ";
Formtxt2 = "열로(\!""||VarList[1]||"\!")";
만약에(
N Items(VarList)==2, Formtxt2 ||= ", As Column(\!""||VarList[2]||"\!")",
N 항목(VarList)>2, For(ii=2, ii <= N 항목(VarList), ii++,
Formtxt2 ||= ", 열로(\!""||VarList[ii]||"\!")"
)
);
Formtxt=Formtxt1||Formtxt2||");";
eval(구문 분석(Formtxt));
// 방법 2b: 보기가 좀 더 쉬움
col4=expr(
NewCol1=dt << New Column("Method b: Mean of "||_names_);
);
form4txt="NewCol1 <<공식(평균( ^_Vars_^ )))";
VarList={"신장", "체중", "나이"};
VarRef = eval list(dt << get Column Reference(VarList));
_Vars_ = "열로( \!"" || ConCat 항목(VarList, "\!"), 열로( \!"") || "\!")";
form4txta = 평가 삽입(form4txt);
Eval(대체(이름 expr(col4),
expr(_names_), 연결 항목(VarList,", ",)
));
Eval(Parse(form4txta)); //Parse는 텍스트를 평가되는 expr로 만듭니다.
// *************************************** //
// ************* 작동 안함 ************* //
//방법 2c: 이것이 최선이라고 생각하지만 정확하게 만들 수는 없습니다. - 여전히 목록이 있습니다.
형식3=expr(
NewCol=dt << New Column(""의 평균||_names_, formula(Mean(_Vars_ )));
);
VarList={"신장", "체중", "나이"};
VarRef = eval list(dt << get Column Reference(VarList));
Eval(대체(이름 expr(form3),
expr(_names_), 연결 항목(VarList,", ",),
expr(_Vars_), VarRef
));
// 방법 2d: 루프를 사용하지만 여전히 올바르지 않음
형식4=expr(
NewCol=dt << New Column(""의 평균||_names_, formula(Mean(_Vars_ )));
);
VarList={"신장", "체중", "나이"};
VarRef = eval list(dt << get Column Reference(VarList));
Form4a =대체(이름 expr(form4),
expr(_names_), 연결 항목(VarList,", ",)
);
For(ii=1, ii <= N 항목(VarList), ii++,
form4a=대체(이름 expr(form4a),
expr(_Vars_), expr(VarRef[ii], _Vars_)
);
);
Eval(대체(이름 expr(form4a),
expr(_Vars_), ""
));
// *************************************** //
// ************* 작동 안함 ************* //
다양한 방법의 좋은 모음.
최근에 나는 이와 같은 경우에 문자열보다 표현식으로 작업하는 것을 선호하게 되었습니다. JSL로 수식을 설정하기 위해 먼저 EvalExpr()을 사용하여 표현식을 빌드한 다음 런타임 시 평가를 피하기 위해 NameExpr()을 사용하여 삽입합니다.
다음은 열 이름 목록 또는 문자열 목록을 기반으로 하는 두 가지 예입니다. 후자는 조금 더 어렵습니다.
dt = 열려 있는 ( "$SAMPLE_DATA/빅 클래스.jmp" ) ;
// 1. 열 이름 목록
L1 = { 나이 , 키 , 무게 } ; // 즉 dt<< 열 이름 가져오기(숫자);
양식1 = 평가 만료 ( 평균 ( 만료 ( L1 ))) ;
양식1열 = dt << 새 열 ( 연결 항목 ( 단어 ( 숯 ( L1 ) , "{}," )) || " 평균" , 공식 ( 이름 만료 ( 양식1 ))) ;
// 2. 문자열 목록
L2 = { "나이" , "키" , "무게" } ; // 즉 dt<< 열 이름 가져오기(숫자, 문자열);
양식2 = 평가 만료 (
평균 (
만료 (
반복하다 (
나 = 0 ;
{ 나 ++ ; 평가 만료 ( 열로 ( 만료 ( L2 [ 나 ])))} ;,
N개 항목 ( L2 )
)
)
)
) ;
form2col = dt << 새 열 ( 연결 항목 ( L2 ) || " 평균" , 공식 ( 이름 만료 ( 양식2 ))) ;