목록에서 같은 이름의 항목 식별목록에서 서로 중복되는 항목을 식별하는 매끄러운 방법이 있는지 궁금합니다. 내 목록은 다음과 같습니다.
values = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
목록에서 "Per"의 모든 위치를 반환하고 싶습니다. 즉
[3, 4, 5, 6, 7]
답을 얻기 위해 목록을 반복할 수 있습니다. 하지만 루프를 피하는 또 다른 방법이 있습니까?
자동화 및 스크립팅Re: 목록에서 동일한 이름의 항목 식별베드로,
이보다 더 좋은 방법이 있을 수도 있습니다.
(올바른 해결책은 Stan의 답변을 참조하세요.)
하지만 여기 긴 하루가 끝나면 만들어진 솔루션이 있습니다. 이는 값 행렬을 가져와 중복 값과 키에 대해 발견된 모든 위치가 있는 값 행렬의 각 값에 대한 항목이 포함된 연관 배열을 생성합니다.
Names Default To Here( 1 );
values = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
dt = New Table( "test", private, New Column( "val", character ) );
dt:val << set values( values );
array = Associative Array( values );
uniqs = array << get keys;
For Each( {vals}, uniqs,
positions = dt << get rows where( :val == vals );
If( Length( positions ) > 1,
array << insert item( vals, positions ),
array << remove item( vals )
);
);
Close( dt, nosave );
Re: 목록에서 동일한 이름의 항목 식별안녕하세요 @pmroz
Loc 기능을 사용할 수 있습니다.
loc(값, "당" );
건배,
스탠
//:*/
값 = {"ABC", "DEF", "당", "당", "당", "당", "당", "XYZ", "UVW"};
loc(값, "당")
/*:
[3, 4, 5, 6, 7]
Re: 목록에서 동일한 이름의 항목 식별정확한 일치만 원하는 경우 JM18 이전에는 Loc을 사용하고 JMP18에서는 Where()를 사용할 수 있습니다.
Names Default To Here(1);
values = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
idx1 = Loc(values, "Per"); // Before JMP17
idx2 = Where(values == "Per"); // JMP18
show(idx1, idx2);
또한 JMP18에서 정확하지 않은 일치가 필요한 경우 Where()를 사용하여 이를 수행할 수 있습니다.
Names Default To Here(1);
values = {"APerBC", "PerDEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
idx2 = Where(Contains(values, "Per")); // JMP18
show(idx2);Re: 목록에서 동일한 이름의 항목 식별나는 loc()이 숫자에만 작동한다고 생각했습니다. 맙소사! 훌륭한 솔루션.
모두 감사합니다!
-베드로
Re: 목록에서 같은 이름의 항목 식별좋은 해결책이네요, 스탠. 반복되는 모든 값을 확인하는 해결책을 제 코드에 통합했습니다.
Names Default To Here( 1 );
values = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
array = Associative Array( values );
uniqs = array << get keys;
For Each( {vals}, uniqs,
positions = loc(values, vals);
If( Length( positions ) > 1,
array << insert item( vals, positions ),
array << remove item( vals )
);
);Re: 목록에서 같은 이름의 항목 식별루프를 작성할 필요 없이 사용할 수 있는 해결책이 있습니다. 이 방법은 예시에서 잘 작동하며, 코드에서 중복 값을 식별하지 않고도 여러 개의 중복 값에도 적용됩니다.
names default to here(1);
values = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
// make data table with values //
dt = new table("item table" /*, private*/);
dt << new column("Items", character, nominal, set values(values));
// identify the duplicate rows //
dt << Select duplicate rows( Match( :Items ) );
// if you also want the first of the duplicate values, otherwise skip the next two lines //
dt << Go To( :Items );
dt << Select All Matching Cells();
// save the selected row results //
dupLocations = dt << get selected rows();
// clean up the data table //
close(dt, no save);
show(dupLocations);