2개의 열로 생성된 그룹의 행을 반복하는 방법모두 안녕
아주 간단한 질문이 있는데 포럼에서 정확한 답변을 찾을 수 없습니다. 내 샘플 데이터 테이블은 다음과 같습니다.

기본적으로 4개의 열이 있으며 "그룹 1"과 "그룹 2"에서 생성된 각 조합 항목을 반복해야 하지만 "항목" #이 다른 경우에만 "경로" 열에서 모든 파일 경로를 엽니다. . 예를 들어 처음 2개 행의 조합은 "aA"이고 항목도 다르기 때문에 스크립트는 파일 경로 1과 2를 모두 열어야 합니다.
데이터 혼합 및 정리Re: 2개의 열로 생성된 그룹에서 행을 순환하는 방법예, 실제로 매우 유용했습니다. file_list 변수는 파일을 여는 데 반드시 필요한 것은 아니기 때문에 혼란스러웠습니다. 반복할 때마다 다른 파일 경로에 할당되는 "file_path" 변수에 머리를 싸는 데도 시간이 걸렸고 이름이 무엇인지는 중요하지 않다는 점을 인정해야 합니다. (제 머릿속에서는 이제 그것을 filepaths_to_open 목록에서 다른 하나의 파일 경로를 선택하고 사용자가 그것으로 "무언가"를 할 수 있도록 하는 수단으로 해석합니다.)
감사합니다! 매주 지식의 작은 성장이 전혀 없는 것보다 낫습니다.
추신: 아래는 귀하의 설명에 대한 이해를 바탕으로 만 작성할 수있었습니다. 다시 말하지만 매우 유용합니다.
Names Default To Here( 1 );
filepaths_to_open = {"$SAMPLE_DATA/Big Class.jmp", "$SAMPLE_DATA/Probe.jmp", "$SAMPLE_DATA/Iris.jmp"};
For Each( {file_path}, filepaths_to_open, Open( file_path ) );
Re: 2개의 열로 생성된 그룹에서 행을 순환하는 방법데모 스크립트를 작성하면 이해하기 가장 쉽다고 생각합니다(Idx를 추가하기 위해 For Each를 약간 수정했습니다. 작동 방식을 조금 더 쉽게 이해할 수 있습니다)
Names Default To Here(1);
filepaths_to_open = {"$SAMPLE_DATA/Big Class.jmp", "$SAMPLE_DATA/Probe.jmp", "$SAMPLE_DATA/Iris.jmp"};
show(filepaths_to_open);
file_list = {};
show(file_list);
For Each({file_path, idx}, filepaths_to_open,
show(idx, file_path);
Insert Into(file_list, Open(file_path));
show(file_list);
);
- file_list를 사용하여 열려 있는 데이터 테이블에 대한 참조를 수집합니다(filepaths_to_open에 이미 파일 경로가 있으므로 파일 경로가 필요하지 않지만 참조가 없음)
- Open(file_path)는 열린 파일에 대한 참조를 반환하고 Insert Into는 해당 참조를 file_list에 추가합니다.
- {filepath}는 어떻게 기능별 사용되어야한다. 기본적으로 filepaths_to_open을 반복하고 file_path 변수에 각 요소(하나씩)를 반환합니다.
filepaths_to_open = {"$SAMPLE_DATA/Big Class.jmp", "$SAMPLE_DATA/Probe.jmp", "$SAMPLE_DATA/Iris.jmp"};
file_list = {};
idx = 1;
file_path = "$SAMPLE_DATA/Big Class.jmp";
file_list = {DataTable("Big Class")};
idx = 2;
file_path = "$SAMPLE_DATA/Probe.jmp";
file_list = {DataTable("Big Class"), DataTable("Probe")};
idx = 3;
file_path = "$SAMPLE_DATA/Iris.jmp";
file_list = {DataTable("Big Class"), DataTable("Probe"), DataTable("Iris")};
몇 가지 질문에 답변해 주시기 바랍니다.
Re: 2개의 열로 생성된 그룹에서 행을 순환하는 방법@jthi , 코드의 마지막 부분과 관련하여 몇 가지 질문을 하고자 합니다. 즉, 이해할 수 없습니다.
file_list = {};
For Each({file_path}, filepaths_to_open,
Insert Into(file_list, Open(file_path));
);
file_list = {};
빈 목록입니다. 루프는 Insert Into(file_list, Open(file_path))를 통해 이를 채울 것입니다. filepaths_to_open에 이미 포함된 목록을 사용할 수 없는 이유는 무엇입니까? 또한 Open(file_path)이 목록에 무언가를 삽입하는 방법을 이해하지 못합니다. 그냥 파일을 여는 기능 아닌가요? 그것이 어떻게 목록에 기여할 수 있습니까?
{file_path}이것도 이해가 안되네요. 실제 파일 경로에 대한 자리 표시자입니까?
이러한 것들을 설명하는 참조 자료가 있습니까? 미리 감사드립니다.
Re: 2개의 열로 생성된 그룹에서 행을 순환하는 방법ValidFile 검사를 빌드하는 방법에 따라 ValidFile 계산 및 가능하면 행 선택을 수정해야 합니다.
new_col = dt << New Column("ValidFile", Numeric, Continuous, << Set Each Value(
If(Col Sum(1, :g1, :g2, :i) == 1 & Col Number(:i, :g1, :g2) > 1,
1
,
0
);
));Re: 2개의 열로 생성된 그룹에서 행을 순환하는 방법@jthi , 항상 그렇듯이 깔끔합니다. 좋은 배움, 감사합니다.
Re: 2개의 열로 생성된 그룹에서 행을 순환하는 방법다른 열 "고유"를 만들어 하나를 찾을 수 있습니다.
new_col = dt << New Column("Unique", Numeric, Continuous, << Set Each Value(
Col Sum(1, :g1, :g2);
));
rows_to_open = dt << Get Rows Where(:ValidFile == 1 & :Unique != 1);
Re: 2개의 열로 생성된 그룹에서 행을 순환하는 방법감사합니다! 마지막 질문, g1, g2 및 i 열에 유효한 파일 조합이 1개만 있는 경우 무시하도록 수식을 추가로 수정하려면 어떻게 해야 합니까?

Re: 2개의 열로 생성된 그룹에서 행을 순환하는 방법이전 변수의 이름을 바꾸도록 내 메시지를 편집했습니다. 문자 열을 합산하지 않고 그룹화()에서 사용합니다. 그리고 우리는 1을 사용하므로 그룹의 각 행에 대해 1씩 증가할 무언가가 있습니다. 작동 방식을 더 쉽게 이해할 수 있도록 이러한 함수를 사용하여 다양한 유형의 수식을 만드는 것이 좋습니다. 스크립팅 인덱스도 몇 가지 예를 제공합니다.
Col Sum(이름,)
Re: 2개의 열로 생성된 그룹에서 행을 순환하는 방법안녕하세요,
3 가지 옵션이있는 훌륭한 답변에 감사드립니다. 참고 사항 중 하나는 코드를 실행하기 위해 rows_to_open1 변수에서 "1"을 제거해야 한다는 것입니다. 나중에 참조할 수 있도록 이 오타를 수정할 수 있다면 정말 좋을 것입니다!
그 외에 귀하의 답변과 관련된 질문이 있습니다. Col Sum, Col Cumulative Sum 및 Col Max(Col Sum) 각각에서 값 "1"의 목적은 무엇입니까? 그리고 g1 및 g2 열의 문자 값을 합산할 수 있는 이유를 모르겠습니다.
Re: 2개의 열로 생성된 그룹에서 행을 순환하는 방법안녕하세요 레셀,
귀하의 솔루션을 시도했지만 실제로 인쇄되었습니다. 언급 한대로 "file path6"을 두 번 사용하십시오. 내가 본 또 다른 문제는 2개의 동일한 행을 갖기 위해 의도적으로 행 5 항목 값을 5에서 7로 변경했을 때 마지막 행("파일 경로 6")이 인쇄된다는 것입니다. 그것을 피할 방법이 있습니까? jthi의 대체 for 루프에도 동일한 문제가 있습니다.


Re: 2개의 열로 생성된 그룹에서 행을 순환하는 방법@레셀
반복 구조를 다시 생각하는 것이 가장 쉬울 것이라고 생각하지만 이중 인쇄 없이 현재 구조가 원하는 방식으로 작동하도록 만들 수 있습니다. 인쇄된 내용의 목록을 유지하거나 이를 방지하기 위한 일종의 추가 논리를 파악 일어나는 것으로부터 . 아래 아이디어가 효과가 있다고 생각합니다.
For( i = 1, i <= N Items( PairedGroupList ), i++,
dt << Select Where( :PairedGroup == PairedGroupList[i] );
dtTemp = dt << Subset( Invisible, Selected Rows );
For( j = 1, j < N Rows( dtTemp ), j++,
If( dtTemp:item[j] != dtTemp:item[j + 1],
Print(dtTemp:path[j]);
If(j + 1 == N Rows( dtTemp ),
Print(dtTemp:path[j + 1]);
)
)
);
Close( dtTemp, no save );
);
예를 들어 여기에서는 마지막 값을 반복하지 않고 다음 값이 마지막인지 확인하고 마지막이면 해당 값도 인쇄합니다(현재 행을 1로 인쇄한 경우).
Re: 2개의 열로 생성된 그룹에서 행을 순환하는 방법문제를 올바르게 이해하고 있는지 확실하지 않지만 아래에는 Col Sum/Col Cumulative Sum 및 Col Max(ColSum())를 사용하는 세 가지 옵션이 있습니다.
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(8),
Compress File When Saved(1),
New Column("g1", Character, "Nominal", Set Values({"a", "a", "a", "a", "a", "c", "c", "c"})),
New Column("g2", Character, "Nominal", Set Values({"A", "A", "B", "B", "B", "A", "A", "A"})),
New Column("i", Numeric, "Continuous", Format("Best", 12), Set Values([1, 3, 2, 4, 4, 5, 7, 9])),
New Column("p",
Character,
"Nominal",
Set Values({"filepath1", "filepath2", "filepath3", "filepath4", "filepath4.1", "filepath5", "filepath6", "filepath7"})
)
);
// depending how we handle duplicated g1+g2+i we would use different formulas
// if we won't open any
new_col = dt << New Column("ValidFile", Numeric, Continuous, << Set Each Value(
Col Sum(1, :g1, :g2, :i);
));
/*
// if we open the first one
new_col = dt << New Column("ValidFile", Numeric, Continuous, << Set Each Value(
Col Cumulative Sum(1, :g1, :g2, :i);
));
*/
/*
// if we don't open g1+g2 at all
new_col = dt << New Column("ValidFile", Numeric, Continuous, << Set Each Value(
Col Max(Col Sum(1, :g1, :g2, :i), :g1, :g2)
));
*/
rows_to_open = dt << Get Rows Where(:ValidFile == 1);
filepaths_to_open = dt[rows_to_open, "p"];
show(filepaths_to_open);
// dt << Delete Column(new_col);
// To open files loop over filepaths_to_open
stop();
file_list = {};
For Each({file_path}, filepaths_to_open,
Insert Into(file_list, Open(file_path));
);

아이디어는 ValidFile이 1인 행을 선택한 다음 해당 파일을 여는 것입니다. 이 이미지는 세 가지 다른 수식에 대한 계산을 보여줍니다.
편집하다:
고정된 이전 참조 rows_to_open1 에게 행_투_열기
Re: 2개의 열로 생성된 그룹에서 행을 순환하는 방법NchooseK Matrix()를 조사하여 귀하에게 적합한지 확인하십시오.스크립팅 인덱스에서 다음과 같이 설명됩니다. nChooseK(n,k) 행과 K 열의 행렬을 생성하여 1에서 n까지 k 정수의 모든 조합을 형성합니다.
문자 데이터 유형과 함께 작동하도록 변경할 수 있는지 궁금합니다.
Names Default To Here( 1 );
Print( NChooseK Matrix( 5, 3 ) );
__________________________
Prints:
[ 1 2 3,
1 2 4,
1 2 5,
1 3 4,
1 3 5,
1 4 5,
2 3 4,
2 3 5,
2 4 5,
3 4 5]
Re: 2개의 열로 생성된 그룹에서 행을 순환하는 방법안녕하세요, 아래는 적어도 당신이 하고 싶은 것을 시작합니다. "만 변경하면 됩니다. 인쇄( dtTemp:경로[j], dtTemp:경로[j + 1] )" 파일을 여는 기능이 있는 부분입니다.
그러나 안타깝게도 이 스크립트는 "파일 경로 6"을 로그에 두 번 인쇄하므로 그에 따라 수정하면 "파일 경로 6"도 두 번 열립니다. 파일 경로가 이미 열려 있는지 확인하는 것과 같은 방법이 있다고 확신하지만 여기에서 늦어지고 있습니다. 아무튼 나머지 방법도 알아내면 알려드리겠습니다. 피드백에 감사드립니다!
dt = New Table( "today's challenge",
Add Rows( 7 ),
New Column( "group1",
Character,
"Nominal",
Set Values( {"a", "a", "a", "a", "c", "c", "c"} )
),
New Column( "group2",
Character,
"Nominal",
Set Values( {"A", "A", "B", "B", "A", "A", "A"} ),
Set Display Width( 70 )
),
New Column( "item",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [1, 3, 2, 4, 5, 7, 9] )
),
New Column( "path",
Character,
"Nominal",
Set Selected,
Set Values(
{"file path 1", "file path 2", "file path 3", "file path 4",
"file path 5", "file path 6", "file path 7"}
)
)
);
dt << New Column( "PairedGroup", formula( :group1 || :group2 ) );
PairedGroupList = Associative Array( dt:PairedGroup ) << Get Keys;
dt << Clear Column Selection;
For( i = 1, i <= N Items( PairedGroupList ), i++,
dt << Select Where( :PairedGroup == PairedGroupList[i] );
dtTemp = dt << Subset( Invisible, Selected Rows );
For( j = 1, j <= N Rows( dtTemp ), j++,
If( dtTemp:item[j] != dtTemp:item[j + 1],
Print( dtTemp:path[j], dtTemp:path[j + 1] )
)
);
Close( dtTemp, no save );
);