일치하는 열 차이와 평균을 생성하는 JSL안녕하세요,
다음 사항에 대해 도움을 받고 싶습니다.
다음 표와 함께 JMP 파일을 첨부했습니다.

내 일반/시작 데이터 세트에는 다음이 포함됩니다.
1. 식별자 "유형"
2. 동일한 접두사와 다양한 숫자 접미사를 가진 알 수 없는 개수의 열 집합, 예: 숫자1, 숫자2, 숫자3...
3. 위의 #2와 동일한 수의 열로 구성된 두 번째 세트(예: B num1, B num2, B num3...)와 동일한 접두사와 일치하는 접미사를 갖습니다.
계산할 세트 A와 세트 B 열을 쌍으로 구성하는 열을 생성하는 jsl 스크립트를 작성하는 데 도움을 받을 수 있습니까?
공식((:B 1.0 - :B 0.5) / (:A 1.0 - :A 0.5) ) ),
공식((:B 1.3 - :B 0.5) / (:A 1.3 - :A 0.5) ) ),
공식((:B 1.3 - :B 1.0) / (:A 1.3 - :A 1.0) ) ),
그런 다음 평균 열("B/A Avg")을 생성하여 생성된 모든 열의 평균을 구합니다. 위의 생성 열은 임의의 숫자일 수 있습니다. 3개일 수도 있고 2개일 수도 있고 6개일 수도 있습니다.
결국 저는 "B/A Avg"의 최종 열을 얻는 데 관심이 많습니다. 스크립트를 단순화하는 경우 중간 열은 선택 사항입니다.
제 질문에 대해 명확히 설명할 내용이 있으면 알려주시기 바랍니다. 많은 감사드립니다.
자동화 및 스크립팅기본 데이터 분석 및 모델링Re: 일치하는 열 차이와 평균을 생성하는 JSL계산에 사용되는 열 쌍은 어떻게 결정됩니까?
Re: 일치하는 열 차이와 평균을 생성하는 JSL동일한 접미사(번호)를 가집니다. 예를 들어 0.5~0.5, 1.0~1.0, 1.3~1.3 등입니다.
Re: 일치하는 열 차이와 평균을 생성하는 JSLA0.5, A1.0, A1.3, B0.5, B1.0 및 B1.3 열이 있는 경우 정확히 (B1.0-B0.5)/(A1.0- A0.5), (B1.3-B0.5)/(A1.3-A0.5) 및 (B1.3-B1.0)/(A1.3-A1.0) 열?
Re: 일치하는 열 차이와 평균을 생성하는 JSL인내심을 가지고 작업해주셔서 정말 감사드리며, 의도를 100% 명확하게 전달하지 못한 점 사과드립니다.
방정식의 경우 항상 다음과 같습니다. ( B num1 - B num2 ) / ( A num1 - A num2 )
우리는 항상 A 그룹과 B 그룹 사이에 동일한 접미사 세트를 얻게 되므로, 내 목표는 A 그룹 사이에서 가능한 모든 조합을 얻는 것입니다. 이는 더 높은 값 접미사 - 더 낮은 값 접미사로만 제한될 수 있습니다.
또는 스크립트를 단순화하면 두 쌍을 모두 포함하여 쌍 간의 차이점을 찾을 수 있습니다. (B1.0-B0.5)/(A1.0-A0.5) 및 (B0.5-B1.0)/(A0.5-A1.0). 이렇게 하면 평균은 여전히 높거나 낮을 때만 동일합니다.
Re: 일치하는 열 차이와 평균을 생성하는 JSL원하는 새 열을 만드는 방법은 다음과 같습니다.
names default to here(1);
dt=current data table();
// Set Prefixes
pre1 = "A";
pre2 = "B";
// Get all levels using Pre1 columns to find the levels
theColumnNames = dt << get column names( string, continuous );
levels = {};
For Each( {col, i}, theColumnNames,
if(word(1,col," ")==pre1,
insert into(levels,trim(substr(col,length(pre1)+1)))
)
);
// Create new columns.
// This is accomplished by creating a character string that is the JSL statement that
// is required to create the new column and it's formula
meanColsList = {};
For( i = 2, i <= N Items( levels ), i++,
For( k = 1, k <= i - 1, k++,
Eval(
Parse(
"dt << New Column( \!"" || pre2 || "/" || pre1 || " " || levels[i] || "-" || levels[k] ||
"\!", formula( (:" || pre2 || " " || levels[i] || " - :" || pre2 || " " || levels[k] || ")
/ (:" || pre1 || " " || levels[i] || " - :" || pre1 || " " || levels[k] || ") ) );"
)
);
insert into( meanColsList, ":\!"" || pre2 || "/" || pre1 || " " || levels[i] || "-" || levels[k] || "\!"n");
);
);
Eval(
Parse(
"dt << New Column( \!"" || pre2 || "/" || pre1 || " Avg\!", formula( Sum(" ||
Concat Items( meanColsList, "," ) || ") / Number(" ||
Concat Items( meanColsList, "," ) || ")));"
)
);Re: 일치하는 열 차이와 평균을 생성하는 JSL이것은 또한 몇 가지 아이디어를 줄 수 있습니다
Names Default To Here(1);
dt = Open("$DOWNLOADS/Question - Auto Col Diff and Avg.jmp");
dt << Clear Column Selection << Clear Select;
col_list = dt << Get Column Names("String");
// Get column types
col_rgx_pattern = "^(.?) (\d+.\d+)";
aa = Associative Array();
For Each({col_name}, col_list,
rgx_result = Regex(col_name, col_rgx_pattern);
If(!IsMissing(rgx_result),
parts = Words(rgx_result);
If(N Items(parts) == 2,
If(!Contains(aa, parts[1]),
aa[parts[1]] = {};
);
Insert Into(aa[parts[1]], parts[2]);
);
);
);
// Check that all different columns have same number parts (ignored in this case)
// Create combinations
ordered_num_parts = Reverse(Sort List(aa[aa << first])); // sort from largest to smallest, works in this simple case
pairs = {};
For(i = 1, i <= N Items(ordered_num_parts) - 1, i++,
For(j = i + 1, j <= N Items(ordered_num_parts), j++,
cur_pair = Eval List({ordered_num_parts[i], ordered_num_parts[j]});
Insert Into(pairs, Eval List({cur_pair}));
);
);
// Create new columns
avg_expr = Expr(Mean());
For Each({pair}, pairs,
f_expr = Substitute(
Expr(
(_last_numerator_ - _first_numerator_) / (_last_denominator_ - _first_denominator_)
),
Expr(_last_numerator_), Name Expr(AsColumn(dt, "B " || pair[1])),
Expr(_first_numerator_), Name Expr(AsColumn(dt, "B " || pair[2])),
Expr(_last_denominator_), Name Expr(AsColumn(dt, "A " || pair[1])),
Expr(_first_denominator_), Name Expr(AsColumn(dt, "A " || pair[2]))
);
Eval(EvalExpr(new_col = dt << New Column("B/A " || pair[1] || "-" || pair[2], Numeric, Continuous, Formula(
Expr(Name Expr(f_expr))
))));
Insert Into(avg_expr, Name Expr(AsColumn((new_col << get name))));
);
Eval(EvalExpr(
dt << New Column("B/A AVG", Numeric, Continuous, Formula(
Expr(Name Expr(avg_expr))
));
));Re: 일치하는 열 차이와 평균을 생성하는 JSLJarmo님 정말 감사드립니다. 이 예제를 통해 새로운 스크립팅 방법을 많이 배웠습니다. 당신의 도움을 주셔서 감사합니다.
Re: 일치하는 열 차이와 평균을 생성하는 JSL도움을 주셔서 정말 감사합니다, 짐. 매우 간단하고 이해하기 쉽습니다. 감사합니다!