중첩된 For 루프의 하나의 원본 테이블에서 여러 개의 누적 테이블을 만드는 것이 가능합니까?하나의 원본 데이터 테이블에서 여러 개의 누적 테이블 생성을 자동화하고 싶습니다. 나는 키워드 목록을 생성하여 이 작업을 수행할 계획이며, 원래 테이블의 열에 해당 키워드가 포함되어 있으면 해당 키워드가 새 데이터 테이블에 쌓이게 됩니다. 기본적으로 3개의 키워드 목록이 있으므로 3개의 누적 데이터 테이블을 생성하게 됩니다. 내 스크립트에는 원본 데이터 테이블의 모든 열을 반복하고 색인화되는 키워드가 포함되어 있는지 확인하는 중첩된 for 루프가 있습니다. 아래를 참조하세요:
groupNames = {"abc", "def", "ghi"};
for (i = 1, i <= nitems(groupNames), i++,
for (j = 1, j <= ncols(Data Table("Original Data")), j++,
if ((contains(Column Name(j), groupNames[i])),
Insert Into(tempStack, Column Name(j));
);
);
tempTable = Stack(
Columns(tempStack),
Source Label Column("Label"),
Stacked Data Column("Data"),
"Non-stacked columns"n (Keep(:tst_temp, :stdf_file)),
);
tempStack = {};
tempTable << set name(char(groupNames[i]) || " Stacked");
);
이 코드를 실행할 때 발생하는 문제는 첫 번째 그룹이 제대로 쌓이지만 다음 그룹을 찾기 위해 for 루프가 i=2로 인덱스를 지정할 때 원본 데이터 테이블을 보는 데 실패하고 대신 테이블을 본다는 것입니다. 방금 쌓였습니다(이 경우 데이터 테이블 "abc Stacked").
for 루프가 새로 생성된 테이블 대신 원래 데이터 테이블을 찾도록 하려면 어떻게 해야 합니까? 감사해요!
최상의,
카오틱라마
자동화 및 스크립팅콘텐츠 구성윈도우Re: 중첩된 For 루프의 하나의 원본 테이블에서 여러 개의 누적 테이블을 만드는 것이 가능합니까?스택 입력에 원본 데이터를 사용하도록 지정하면 됩니다.
groupNames = {"abc", "def", "ghi"};
For( i = 1, i <= N Items( groupNames ), i++,
For( j = 1, j <= N Cols( Data Table( "Original Data" ) ), j++,
If( (Contains( Column Name( j ), groupNames[i] )),
Insert Into( tempStack, Column Name( j ) )
)
);
tempTable = data table("Original Data") << Stack(
Columns( tempStack ),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
"Non-stacked columns"n( Keep( :tst_temp, :stdf_file ) ),
Output Table( Char( groupNames[i] ) || " Stacked" )
);
tempStack = {};
);Re: 중첩된 For 루프의 하나의 원본 테이블에서 여러 개의 누적 테이블을 만드는 것이 가능합니까?안녕 짐,
불행히도 나는 이것을 이미 시도했지만 작동하지 않는 것 같습니다. 여전히 혼란스럽고 i=2 반복을 실행할 때 새로 쌓인 테이블을 참조하고 있다고 생각합니다. 새로 쌓인 테이블에 4개의 열이 있기 때문에 알 수 있습니다. 내가 받은 오류는 j=5일 때 실패하는 aj 인덱싱 오류입니다.

참고로 저는 JMP Pro 17.2를 사용하고 있습니다.
Re: 중첩된 For 루프의 하나의 원본 테이블에서 여러 개의 누적 테이블을 만드는 것이 가능합니까?코드를 2가지 변경하는 것으로 인해 혼란스러울 수 있지만 하나만 이야기하겠습니다. 가장 최근에 테스트를 했을 때 다음 라인을 사용하셨나요?
tempTable = data table("Original Data") << Stack(
그렇게 하고 지정한 오류가 발생한 경우 샘플 데이터 테이블을 제공하도록 요청하고 문제를 더 자세히 살펴보겠습니다.
Re: 중첩된 For 루프의 하나의 원본 테이블에서 여러 개의 누적 테이블을 만드는 것이 가능합니까?안녕 짐,
걱정하지 마세요. 업데이트된 코드와 샘플 데이터는 다음과 같습니다. 제안한 변경 사항으로는 여전히 작동하지 않습니다.
tempStack = {};
GroupNames = {"abc", "def"};
for (i = 1, i <= nitems(GroupNames), i++,
for (j = 1, j <= ncols(Data Table("Sample")), j++,
if ((contains(Column Name(j), GroupNames[i])),
Insert Into(tempStack, Column Name(j));
);
);
colNum = ncols(Data Table("Sample"));
tempTable = Data Table("Sample") << Stack(
Columns(tempStack),
Source Label Column("Label"),
Stacked Data Column("Data"),
"Non-stacked columns"n (Keep(:tst_temp, :stdf_file)),
Invisible(1)
);
tempStack = {};
tempTable << set name(char(GroupNames[i]) || " Stacked");
);무엇을 찾았는지 알려주세요. 감사해요
Re: 중첩된 For 루프의 하나의 원본 테이블에서 여러 개의 누적 테이블을 만드는 것이 가능합니까?스크립트를 엉망으로 만든 것은 Column Name() 함수였습니다. 현재 활성 데이터 테이블을 가리킵니다. 따라서 원래 샘플 데이터 테이블에 현재 데이터 테이블의 설정을 다시 추가했습니다.
names default to here(1);
tempStack = {};
GroupNames = {"abc", "def"};
for (i = 1, i <= nitems(GroupNames), i++,
Current data table(data table("Sample"));
for (j = 1, j <= ncols(Data Table("Sample")), j++,
if ((contains(Column Name(j), GroupNames[i])),
Insert Into(tempStack, Column Name(j));
);
);
colNum = ncols(Data Table("Sample"));
tempTable = Data Table("Sample") << Stack(
Columns(tempStack),
Source Label Column("Label"),
Stacked Data Column("Data"),
"Non-stacked columns"n (Keep(:tst_temp, :stdf_file)),
Invisible(1)
);
tempStack = {};
tempTable << set name(char(GroupNames[i]) || " Stacked");
);Re: 중첩된 For 루프의 하나의 원본 테이블에서 여러 개의 누적 테이블을 만드는 것이 가능합니까?짐,
이 문제에 대해 도움을 주셔서 감사합니다! 아주 잘 설명되어 있고 완벽하게 작동합니다.
최상의,
카오틱라마
Re: 중첩된 For 루프의 하나의 원본 테이블에서 여러 개의 누적 테이블을 만드는 것이 가능합니까?다음은 스크립트를 상당히 많이 수정한 다른 제안입니다. For Each()(내 생각에는 For()보다 읽기 쉬움)와 연관 배열을 사용하여 열 그룹을 수집하는 약간 다른 접근 방식을 사용합니다.
Names Default To Here(1);
// Initialize Associative Array with groups and empty lists
groups = ["abc" => {}, "def" => {}];
dt = Open("$DOWNLOADS/Sample.jmp");
colnames = dt << Get Column Names("String");
// Collect columns to each key in associative array
For Each({colname}, colnames,
For Each({{group, val}}, groups,
If(Contains(colname, group),
Insert Into(groups[group], colname);
);
);
);
// Loop over the associative array and create the stacked tables
stacked_tables = {};
For Each({{groupname, groupcols}}, groups,
stacked_dt = dt << Stack(
Columns(Eval(groupcols)),
Source Label Column("Label"),
Stacked Data Column("Data"),
"Non-stacked columns"n(Keep(:tst_temp, :stdf_file)),
Output Table(groupname || " Stacked"),
Invisible(1)
);
Insert Into(stacked_tables, stacked_dt);
);
show(stacked_tables);