목록에서 일치하는 값을 구분하는 방법안녕,
다음을 포함할 수 있는 목록이 있습니다(예: {22, 22, 22, 33, 33}). 나는 목록에 있는 각 고유 값의 수(예: 22개와 33개)를 얻을 수 있기를 원합니다. 문제는 내 목록이 얼마나 길어질지, 목록에 고유 번호가 몇 개나 있을지 모른다는 것입니다. 이에 대한 솔루션을 일반화하는 방법이 JSL에 있습니까?
감사해요
자동화 및 스크립팅Re: 목록에서 일치하는 값을 구분하는 방법마지막 편집에서 "my_bigger_list"를 "my_list"로 변경해야 한다고 생각합니다.
Re: 목록에서 일치하는 값을 구분하는 방법안녕,
걱정하지 마세요. 문제를 해결했으며 귀하의 솔루션은 문제의 일부가 아니었습니다. 감사해요.
Re: 목록에서 일치하는 값을 구분하는 방법@pmroz 의 답변에 관심이 생겼습니다.나는 보통 오버헤드 때문에 가능하다면 데이터 테이블을 피하려고 하기 때문입니다.타이밍을 가지고 놀았어
names default to here(1);
my_list = {44, 33, 22, 33, 44};
repeat_list = [1, 5, 10, 50, 100, 1000, 2500, 5000, 7500, 10000];
dt_timing = new table("Timings",
new column("List Size"),
new column("Design"),
new column("Loop"),
new column("Summarize"),
);
for(ii=1, ii<=20, ii++,
for(ir = 1, ir <= nitems(repeat_list), ir++,
my_bigger_list = repeat(my_list, repeat_list[ir]);
// using design
st = HPTime();
aa = associative array(my_bigger_list);
keys = aa << Get Keys;
d = design(my_bigger_list, keys);
aa_design = associative array(keys, VSum(d));
time_design = HPTime() - st;
//using a loop
st = HPTime();
aa_loop = associative array(my_bigger_list, repeat(0, nitems(my_bigger_list)));
for(i=1, i<=nitems(my_bigger_list), i++,
aa_loop[my_bigger_list[i]]++;
);
time_loop = HPTime() - st;
//using a data table
st = HPTime();
dt = New Table( "Untitled", invisible, Add Rows( nitems(my_bigger_list) ),
New Column( "Column 1", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( my_bigger_list )
)
);
summarize(dt, unique_value_list = by(:column1), unique_count = count(:column 1) );
close(dt, nosave);
aa_peter = associative array(unique_value_list, unique_count);
time_peter = HPTime()-st;
Eval(EvalExpr(
dt_timing << Add Rows({List Size = Expr(Nitems(my_bigger_list)), Design = Expr(time_design), Loop = Expr(time_loop), Summarize = Expr(time_peter)});
));
);
);
dt_stack = dt_timing << Stack(
columns( :Design, :Loop, :Summarize ),
Source Label Column( "Method" ),
Stacked Data Column( "Timing" )
);
close(dt_timing, no save);
biv = dt_stack << Bivariate(
Y( :Timing ),
X( :List Size ),
group by(:Method),
fit line(),
SendToReport(
Dispatch(
{},
"Bivar Plot",
FrameBox,
{Row Legend(
Method,
)}
),
)
);
분명히 목록 크기에 따라 다릅니다.하지만 다양한 목록 크기에서 각각 20번씩 실행한 결과 다음과 같은 결과를 얻었습니다.

디자인은 제가 찾을 수 있는 가장 빠른 방법이었습니다.그리고 나는 확실히 동의합니다 @txnelson 나는 항상 문자를 반환하기 때문에 요약을 좋아하지 않습니다.
Re: 목록에서 일치하는 값을 구분하는 방법나는 디자인을 좋아하는 사람이다.
names default to here(1);
l = {22, 22, 22, 33, 33};
l = sort ascending(l);
d = VSuM(design(l));
csum = cumulative sum(d);
lvalues = l[csum];
aa = associative array(lvalues, d);
*편집* 정렬하는 데 시간이 많이 걸리기 때문에 훨씬 더 빠르다는 것을 깨달았습니다.
names default to here(1);
my_list = {44, 33, 22, 33, 44};
aa = associative array(my_list );
keys = aa << Get Keys;
d = design(my_list , keys);
aa_design = associative array(keys, VSum(d));
*다시 편집하세요(이게 왜 그렇게 귀찮은지 모르겠습니다)* 연관 배열이 마음에 들지 않았지만 여전히 더 빠릅니다.
names default to here(1);
my_list = {44, 33, 22, 33, 44};
d = design(my_bigger_list, <<LEVELS></LEVELS>Re: 목록에서 일치하는 값을 구분하는 방법파일의 열을 반복하는 경우 Tabulate 또는 Summary 명령을 사용하면 어떨까요?다른 열을 기준으로 항목을 그룹화하는 경우 해당 열을 "기준" 변수로 사용할 수 있습니다.예를 들어:
| ID |
값 |
| ㅏ |
1 |
| ㅏ |
2 |
| ㅏ |
2 |
| 비 |
2 |
| 비 |
삼 |
| 비 |
삼 |
| 비 |
4 |
| 비 |
4 |
표를 사용하여 ID 및 값 열을 행 끌어 놓기 영역 위로 드래그합니다.값의 역할을 그룹화 변수로 변경해야 합니다.결과는 다음과 같습니다.
| ID |
값 |
N |
| ㅏ |
1 |
1 |
| ㅏ |
2 |
2 |
| 비 |
2 |
1 |
| 비 |
삼 |
2 |
| 비 |
4 |
2 |
따라서 A의 경우 발생 횟수(1, 2)와 함께 두 개의 고유한 값(1, 2)이 있습니다.B의 경우 발생 횟수(1, 2, 2)와 함께 세 가지 고유 값(2, 3, 4)이 있습니다.
이에 상응하는 JSL은 다음과 같습니다.
dt = New Table( "Test", Add Rows( 8 ),
New Column( "ID", Character, "Nominal",
Set Values( {"A", "A", "A", "B", "B", "B", "B", "B"} ) ),
New Column( "Value", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( [1, 2, 2, 2, 3, 3, 4, 4] ) )
);
dtab = dt << Tabulate(
Show Control Panel( 0 ),
Add Table( Row Table( Grouping Columns( :ID, :Value ) ) ),
invisible
);
dt2 = dtab << Make Into Data Table;Re: 목록에서 일치하는 값을 구분하는 방법일부 데이터와 코드를 게시할 수 있나요?
Re: 목록에서 일치하는 값을 구분하는 방법안녕 @pmroz ,
귀하가 게시한 첫 번째 솔루션을 시도했는데 하나의 파일/목록에서 잘 작동합니다. 그러나 귀하의 코드를 함수로 사용하고 이를 반복할 때(이전 반복에서 아무것도 저장되지 않았는지 확인하기 위해 모든 변수를 초기화했음에도 불구하고) 작동하지 않는 것 같습니다. 사용되는 목록을 얻기 위해 파일의 열을 반복하기 때문에 파일을 참조하고 있습니다. 모든 목록과 변수를 초기화하는 동안 무슨 일이 일어나고 있는지에 대한 아이디어가 있습니까?
Re: 목록에서 일치하는 값을 구분하는 방법@재즈 ,
이는 Loc()을 사용하는 대체 접근 방식입니다.
MyList = {22,33,22,22,22,33,33,44,44,44,33,22};
AA = Associative Array(MyList);
UniqueVals = AA << Get Keys;
Frequency = {};
for(i = 1, i <= N Items(UniqueVals),i++,
Insert Into(Frequency,N Rows(Loc(MyList,UniqueVals[i])));
);
Show(Frequency);
Re: 목록에서 일치하는 값을 구분하는 방법커뮤니티의 위시리스트 영역에 이 제안을 게시해 주세요.
Re: 목록에서 일치하는 값을 구분하는 방법요약 플랫폼에 대한 제가 지원하는 점은 그룹화 변수가 원래 데이터 테이블에 있었던 것처럼 요약 데이터 테이블에서도 동일한 데이터 유형으로 유지된다는 것입니다.Summarize() 함수에서는 지정된 기준 열이 숫자인 경우에도 항상 문자 값으로 반환됩니다.
Re: 목록에서 일치하는 값을 구분하는 방법나는 동의한다 @pmroz 그리고 @txnelson , 데이터 테이블을 사용하면 이 작업이 쉬워집니다.
나는 요약하다() 기능 이상 표로 만들다 그리고 요약 그래도 이것을 위해.
my_list = {22, 22, 22, 33, 33};
dt = New Table( "Untitled",
private,
Add Rows( N Items( my_list ) ),
New Column( "Column 1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( my_list )
)
);
summarize(dt, group=by(:column 1), n=count(:column 1));
show(group, n);
Re: 목록에서 일치하는 값을 구분하는 방법감사해요,
JMP에 열 및 행과 마찬가지로 목록/연관 배열에 대해 일치 항목 찾기/일치 항목 반환 기능이 포함되어 있다면 유용할 것입니다.
Re: 목록에서 일치하는 값을 구분하는 방법요약하는 것을 잊지 마세요.더 짧습니다.
my_list = {22, 22, 22, 33, 33};
dt = New Table( "Untitled", invisible, Add Rows( nitems(my_list) ),
New Column( "Column 1", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( my_list )
)
);
summarize(dt, unique_value_list = by(:column1), unique_count = count(:column 1) );
show(unique_value_list, unique_count);
Re: 목록에서 일치하는 값을 구분하는 방법여기에 내 변형이 있습니다. @pmroz 해결책.그것은 구식 솔루션에 가깝습니다.
my_list = {22, 22, 22, 33, 33};
dt = New Table( "Untitled",
private,
Add Rows( N Items( my_list ) ),
New Column( "Column 1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( my_list )
)
);
// Use the Summary Platform to create the aggragate values
dtSum = dt << Summary(
private,
Group( :Column 1 ),
Freq( "None" ),
Weight( "None" )
);
// Create the new lists
unique_value_list = As List( dtSum:column 1 << get values );
unique_count = As List( dtSum:n rows << get values );
Close( dt, nosave );
Close( dtSum, nosave );
Show( unique_value_list, unique_count );Re: 목록에서 일치하는 값을 구분하는 방법테이블 작업은 아마도 이 작업을 수행하는 가장 빠른 방법일 것입니다.
my_list = {22, 22, 22, 33, 33};
dt = New Table( "Untitled", invisible, Add Rows( nitems(my_list) ),
New Column( "Column 1", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( my_list )
)
);
dtab = dt << Tabulate(Show Control Panel( 0 ),
Add Table( Row Table( Grouping Columns( :Column 1 ) ) ));
dt2 = dtab << Make Into Data Table(invisible);
unique_value_list = dt2:column 1 << get values;
unique_count = dt2:n << get values;
close(dt, nosave);
close(dt2, nosave);
show(unique_value_list, unique_count);Re: 목록에서 일치하는 값을 구분하는 방법연관 배열과 << 키 가져오기 기능을 사용하여 {22, 33}과 같은 고유 값 목록을 가져왔지만 여전히 원본에서 각 고유 값의 수를 가져오는 방법을 모르겠습니다. 목록.