Excel vzorec: Třídění a extrahování jedinečných hodnot -

Obecný vzorec

=MMULT(--(data>TRANSPOSE(data)),ROW(data)^0)

souhrn

Chcete-li dynamicky řadit a extrahovat jedinečné hodnoty ze seznamu dat, můžete pomocí maticového vzorce určit pořadí ve sloupci pomocníka a poté pomocí speciálně vytvořeného vzorce INDEX a MATCH extrahovat jedinečné hodnoty. V zobrazeném příkladu je vzorec pro stanovení pořadí v C5: C13:

=IF(data="",ROWS(data),MMULT(--(data>TRANSPOSE(data)),ROW(data)^0))

kde „data“ je pojmenovaný rozsah B5: B13.

Poznámka: toto je vzorec pole s více buňkami, zadaný pomocí kláves Control + Shift + Enter.

Vysvětlení

Poznámka: Základní myšlenka tohoto vzorce je převzata z příkladu ve vynikající knize Mika Girvina Control + Shift + Enter.

Zobrazený příklad používá několik vzorců, které jsou popsány níže. Na vyšší úrovni se funkce MMULT používá k výpočtu číselného pořadí ve sloupci pomocníka (sloupec C) a toto pořadí se pak používá vzorcem INDEX a MATCH ve sloupci G k extrahování jedinečných hodnot.

Hodnoty datových hodnot

Funkce MMULT provádí násobení matic a používá se k přiřazení číselného pořadí každé hodnotě. První pole je vytvořeno s následujícím výrazem:

--(data>TRANSPOSE(data))

Zde používáme funkci TRANSPOSE k vytvoření horizontálního pole dat a všechny hodnoty jsou navzájem porovnány. V podstatě je každá hodnota porovnána s každou jinou hodnotou, aby bylo možné odpovědět na otázku „je tato hodnota větší než každá jiná hodnota“. Výsledkem je dvourozměrné pole, 9 sloupců x 9 řádků, vyplněné hodnotami TRUE a FALSE. Dvojitý zápor (-) se používá k vynucení hodnot TRUE FALSE na 1 s a nuly. Výsledné pole můžete vizualizovat takto:

Matice 1s a nul výše se stane array1 uvnitř funkce MMULT. Pole 2 je vytvořeno s tímto výrazem:

ROW(data)^0

Zde se každé číslo řádku v „datech“ zvýší na nulu, aby se vytvořilo jednorozměrné pole, 1 sloupec x 9 řádků, vyplněné číslem 1. MMULT poté vrátí maticový produkt dvou polí, která se stanou hodnoty zobrazené ve sloupci hodnocení.

Vracíme zpět všech 9 žebříčků najednou v poli, takže musíme dát výsledky do různých buněk najednou. Jinak každá buňka zobrazí pouze první hodnotící hodnotu v poli, které je vráceno.

Poznámka: jedná se o vzorec vícebuněčného pole zadaný pomocí kláves Control + Shift + Enter v rozsahu C5: C13.

Zpracování prázdných buněk

S prázdnými buňkami se zachází s touto částí hodnotícího vzorce:

=IF(data="",ROWS(data)

Tady, než spustíme MMULT, zkontrolujeme, zda je aktuální buňka v „datech“ prázdná. Pokud ano, přiřadíme hodnostní hodnotu, která se rovná počtu řádků v datech. To slouží k vynucení prázdných buněk do dolní části seznamu, kde je lze později snadno vyloučit při extrahování jedinečných hodnot (vysvětleno níže).

Počítání jedinečných hodnot

Chcete-li spočítat jedinečné hodnoty v datech, vzorec v E5 je:

=SUM(--(FREQUENCY(rank,rank)>0))-(blank>0)

Vzhledem k tomu, že výše uvedený vzorec hodnocení přiřazuje každé hodnotě číselné hodnocení, můžeme k počítání jedinečných hodnot použít funkci FREQUENCY s funkcí SUM. Tento vzorec je podrobně vysvětlen zde. Poté od výsledku odečteme 1, pokud jsou v datech nějaké prázdné buňky:

-(blank>0)

kde „blank“ je pojmenovaný rozsah E8 a obsahuje tento vzorec:

=COUNTBLANK(data)

V zásadě snížíme jedinečný počet o jednu, pokud jsou v datech prázdné buňky, protože je nezahrnujeme do výsledků. Jedinečný počet v buňce E5 má název „jedinečný“ (pro jedinečný počet) a je používán vzorcem INDEX a MATCH k odfiltrování prázdných buněk (popsáno níže).

Extrakce jedinečných hodnot

Chcete-li extrahovat jedinečné hodnoty, obsahuje G5 následující vzorec zkopírovaný dolů:

=IF(ROWS($G$5:G5)>unique,"",INDEX(data,MATCH(MIN(IF(ISNA(MATCH(data,$G$4:G4,0)),rank)),rank,0)))

Než spustíme vzorec INDEX a MATCH, nejprve zkontrolujeme, zda je aktuální počet řádků v oblasti těžby větší než jedinečný počet pojmenovaného rozsahu „unique“ (E5):

=IF(ROWS($G$5:G5)>unique,"",

Pokud ano, jsme hotovi s extrahováním jedinečných hodnot a vrátíme prázdný řetězec (""). Pokud ne, spustíme extrakční vzorec:

INDEX(data,MATCH(MIN(IF(ISNA(MATCH(data,$G$4:G4,0)),rank)),rank,0))

Všimněte si, že zde existují dvě funkce MATCH, jedna uvnitř druhé. Vnitřní MATCH používá rozšiřující se rozsah pro pole a pojmenovaný rozsah „data“ pro vyhledávací hodnotu:

MATCH(data,$G$4:G4,0)

Všimněte si, že rozšiřující se rozsah začíná v řádku „výše“, v příkladu na řádku 4. Výsledkem vnitřní MATCH je pole, které pro každou hodnotu v datech obsahuje buď číselnou pozici (hodnota již byla extrahována), nebo chybu # N / A (hodnota ještě nebyla extrahována). Potom použijeme IF a ISNA k filtrování těchto výsledků a vrátíme hodnotu pořadí pro všechny hodnoty v dosud nevyextrahovaných "datech":

IF(ISNA(results),rank))

Výsledkem této operace je pole, které se přivede do funkce MIN za účelem získání „minimální hodnoty hodnoty“ pro dosud nevyextrahované hodnoty dat. Funkce MIN vrací tuto hodnotu k vnějšímu MATCH jako vyhledávací hodnotu a pojmenovaný rozsah „rank“ jako pole:

MATCH(min_not_extracted,rank)),rank,0)

Nakonec MATCH vrátí pozici nejnižší hodnoty hodnoty na INDEX jako číslo řádku a INDEX vrátí hodnotu dat v aktuálním řádku rozsahu extrakce.

Zajímavé články...