이전 행과 다른 열에 종속된 후속 행안녕하세요 - 일부 실험이 이전 실험에 의존하는 일련의 실험 작업을 하고 있습니다(예: 이전에 만든 솔루션을 혼합하여 새 솔루션을 만들고 있음). 이전 솔루션의 이름을 얻기 위해 열을 읽고 두 번째 열을 검색하여 해당 이름의 행을 찾은 다음 해당 행과 세 번째 열이 있는 셀의 값을 가져오는 함수를 만들려고 합니다. Match는 일종의 이 작업을 수행하는 것처럼 보이지만 작동하도록 할 수 없으며 부분적으로는 match가 검색 열의 명시적으로 명시된 수준을 예상하고 내가 깨닫지 못하는 다른 항목을 예상하기 때문이라고 생각합니다. 나는 JSL에 대한 경험이 전혀 없고 열 일치 기능과 같은 것을 선호하지만 JSL이 필요한 것이라면 완전히 괜찮습니다.
불필요한 다른 열을 모두 보지 않고 요점을 파악해야 하는 더미 테이블을 첨부했습니다. 마지막 열은 실패한 수식이 있는 열이며 여기 스크린샷이 있습니다.

처리하기 쉬운 경우 작동하지 않는 코드:
Match( :용액명, :희석용액, :주어진 농도) /
: 희석배수
미리 감사드립니다.
자동화 및 스크립팅윈도우Re: 후속 행은 이전 행과 다른 열에 종속됩니다.한 가지 옵션은 이와 같은 것을 사용하여 색인을 얻는 것입니다.
row_idx = Loc(:Letters << Get Values, :Used solution for dilution);
If(N Items(row_idx) < 1,
.,
row_idx[1]
);
그런 다음 사용할 수 있습니다 데이터 테이블 첨자 행 특정 행의 값에 액세스합니다. 따라서 최종 공식은 다음과 같습니다.
row_idx = Loc(:Letters << Get Values, :Used solution for dilution);
If(N Items(row_idx) < 1,
.,
:Given Concentration[row_idx[1]] / :Dilution Factor
);
Re: 후속 행은 이전 행과 다른 열에 의존합니다.제가 생각해낸 공식은 다음과 같습니다.단순화할 수는 있지만 현재 형식에서는 작동하는 것으로 보입니다.
x = .;
If( :Used solution for dilution[Row()] != "",
curRow = Row();
targetRow = (Current Data Table() << get rows where(
:Letters == :Used solution for dilution[curRow]
))[1];
x = :Given Concentration[targetRow] / :Dilution Factor[curRow];
);
x;
Re: 후속 행은 이전 행과 다른 열에 종속됩니다.여기요 @jthi - 성공했어! JSL에 처음 참여하는 것이기 때문에 논리를 이해하고 있으며 무슨 일이 일어나고 있는지 완전히 추론하지는 않습니다.
1. :Column1 << Get Values는 :Column1과 내용 및 순서가 동일한 임시 목록을 생성합니다.
2. Loc(:Column2 << Get Values, :Column2) 그런 다음 :Column1이 :Column2의 각 행 내용과 일치하는 모든 행 번호의 정렬된 목록을 제공합니다. 우리는 이것을 row_idx에 할당합니다.
if 문 내에서,
3. N Items( row_idx ) < 1 은 목록이 null인 경우(즉, 일치하는 항목이 없는 경우) "."를 넣어 공백으로 만듭니다. 안에,
4. row_idx 목록에 1개 이상의 항목이 있는 경우 :Column3[row_idx[1]]는 인덱스의 인덱스입니다. 여기서 row_idx 목록의 첫 번째 항목을 사용하고 해당 항목을 n번째 항목으로 사용합니다. 의 :칼럼3.
그게 요점인가요?
작업해 주셔서 감사합니다!
Re: 후속 행은 이전 행과 다른 열에 종속됩니다.@txnelson 코드 주셔서 감사합니다. 당신도 일했습니다! JSL에 대한 경험이 없으며 VBA 및 Matlab에서만 작업했습니다. @jthi , 이해하고 싶습니다. 그래서 내가 이해했는지 확인하기 위해
1. 엑스=. 빈 변수 x를 정의합니다.
2. 비어 있지 않은 평가 대상과 동일한 행에 희석용으로 사용된 세포가 있는 경우 =>
3. curRow = Row()는 curRow를 현재 행 번호로 정의합니다.
4. 행 가져오기(
:용액명 == :희석용액[curRow]
))[1]
:Solution의 값과 동일한 "get[s] row[ numbers] where" 값을 사용하여 현재 행의 희석에 사용된 솔루션의 값을 가져옵니다.
5. targetRow = (Current Data Table() << get rows where(... 그런 다음 3단계에서 결정된 행에서 행렬을 만들고 아래첨자 1은 이 행렬의 첫 번째 항목을 가져옵니다.
6. 마지막으로 x는 4에서 지정한 주어진 농도의 행을 3에서 지정한 현재 행의 희석 계수로 나누어 채워집니다.
7. 셀에 "x"를 반환합니다.
한 가지 질문은 5단계에서 나온 것입니다. targetRow는 우리가 원하는 행의 각 항목 목록이라고 생각하지만 6단계가 작동하려면 실제 행 번호를 반환해야 합니다. Current Data Table () << get rows where(... 작동 방식을 오해하고 있는 것 같습니다. 자세히 설명해 주시겠습니까?
시간을 내주셔서 다시 한 번 감사드립니다!
Re: 후속 행은 이전 행과 다른 열에 종속됩니다.<< Get Rows Where()는 함수에 전달된 선택 기준과 일치하는 행의 행렬을 반환합니다.
따라서 "희석에 사용된 용액" 열에 대한 값이 공백/누락되지 않은 행이 있는 것으로 확인되면,
- 메모리 변수 curRow는 처리 중인 현재 행 Row()로 설정됩니다.이 경우 curRow는 6으로 설정됩니다.
- targetRow는 "희석에 사용된 용액"에 대한 현재 행 값과 함께 "문자" 열에 일치하는 값이 있는 행에서 "주어진 농도"를 포함하는 행으로 설정되어야 합니다.
- 구문 분석 시 Get Rows Where는 다음과 같습니다.
<< get rows where(:Letters == :"C"])
이 함수는 반환되는 여러 행을 허용하므로 선택 기준과 일치하는 모든 행 번호의 행렬을 반환합니다.이 경우 단일 요소 행렬이 반환되고 첫 번째 요소의 값인 3이 필요합니다. 행의 행 번호입니다. 여기서 Letters 열은 "C"와 같습니다.
Re: 후속 행은 이전 행과 다른 열에 종속됩니다.<< 값 가져오기는 열의 값을 목록이나 행렬로 가져오는 데 사용됩니다(데이터 유형에 따라 다름).
위치() 우리가 제공하는 항목과 일치하는 행렬/목록에서 인덱스를 가져오거나 누락되지 않은 값의 인덱스를 반환하는 데 사용할 수 있습니다(제 생각에는 매우 좋은 기능입니다).
Loc은 행렬을 반환하므로 N Items()를 사용하여 인덱스에 액세스할 때 문제를 피하기 위해 발견된 인덱스가 있는지 확인합니다. 색인이 없으면 해당 행의 값을 누락된 "."으로 설정합니다.
제공된 데이터를 기반으로 인덱스에서 항상 첫 번째 인덱스를 사용하도록 선택했습니다. 일치하는 항목이 여러 개인 경우 더 복잡한 계산이 필요한 경우 모두 사용할 수 있습니다.
아래는 몇 가지 설명이 있는 수식 생성입니다.
Names Default To Here(1);
dt = New Table("Calculated concentration - Dummy table",
Add Rows(6),
Compress File When Saved(1),
New Column("Given Concentration", Numeric, "Continuous", Format("Best", 12), Set Property("Units", "ppm"), Set Values([12, 50, 23, 14, 2, .])),
New Column("Letters", Character(1), "Nominal", Set Values({"A", "B", "C", "D", "E", "F"}), Set Display Width(38)),
New Column("Used solution for dilution", Character, "Nominal", Set Values({"", "", "", "", "", "C"})),
New Column("Dilution Factor", Numeric, "Continuous", Format("Best", 12), Set Values([., ., ., ., ., 2.29837984]))
);
dt << New Column("Calculated Concentration (ppm)", Numeric, Continuous, Formula(
// use As Constant to evaluate this only once (should make it more efficient if you have lots of data)
As Constant(all_letters = :Letters << get values); // << get values gets values from column into a matrix or list
idx_for_letter = Loc(all_letters, :Used solution for dilution); // Loc can be used to return indices of matches in matrix but it has many other uses
If(N Items(idx_for_letter) == 0, // to avoid issues when trying to access incorrect indices, check for empty matrix
. // set missing value to column IF no indices found
,
:Given Concentration[idx_for_letter[1]] / :Dilution Factor // perform calculation using first index found from idx_for_letter
);
));
사용된 함수에 대한 설명을 보려면 먼저 Scripting Index를 사용하여 함수를 검색한 다음 "항목 도움말"을 클릭하여 도움말 페이지로 이동하는 것이 좋습니다. 예를 들어 "as constant"를 검색합니다.

주제 도움말을 클릭하여 이 페이지를 엽니다. 상수(expr)로