[[20081202113117]] 『重複のカウント』(ポム) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『重複のカウント』(ポム)

 お世話になります。
 下記のようなレイアウトの表があります。

      [A]
 [1]  123
 [2]  45
 [3]  78
 [4]  123
 [5]  78
 [6]  123
 [7]  659
 [8]  45
 [9]  45
 [10] 45

 この中から重複している数をカウントし、B1セルに表示させたいのですが
 複数回表示されてる物も1としてカウントしたいです。

 例示のレイアウトなら、B1セルに「4」と表示させたいです。
 ご教示宜しくお願い致します。

 重複している数ではなく、種類の数ですよね?

 =COUNT(INDEX(0/(MATCH(A1:A10,A1:A10,0)=ROW(A1:A10)),))

 (ROUGE)

 ROUGEさん、ありがとうございます。
 種類の数ではなく、あくまで重複していたら重複数に関わらず1としてカウントしたいです。

 提示頂いた数式だと戻り値が5になりますが、上のレイアウトで言うと
 A7セルの「659」は重複していないのでカウントには含まず、4という答えを返したいのです…。

 (ポム)

 いや、上記の例でいうと、私の数式では 4 になるんですよね。。。
 ま、そういうことであれば、3 が返ればよいんですかね。

 =COUNT(INDEX(0/(MATCH(A1:A10,A1:A10,0)=ROW(A1:A10)),))-COUNT(INDEX(0/(COUNTIF(A1:A10,A1:A10)=1),))

 (ROUGE)

 すいません、私の勘違いでした…。

 ×例示のレイアウトなら、B1セルに「4」と表示させたいです。
 ○例示のレイアウトなら、B1セルに「3」と表示させたいです。

 ×A7セルの「659」は重複していないのでカウントには含まず、4という答えを返したい
 ○A7セルの「659」は重複していないのでカウントには含まず、3という答えを返したい

 =COUNT(INDEX(0/(MATCH(A1:A10,A1:A10,0)=ROW(A1:A10)),))-COUNT(INDEX(0/(COUNTIF(A1:A10,A1:A10)=1),))

 を試した所、完璧でした!恐縮ですが
 =INDEX(0/(MATCH(A1:A10,A1:A10,0)=ROW(A1:A10)),)
 ↑この部分は、一体どういう計算がされているのか解説をお願いできませんでしょうか? 

 (ポム)

 計算というか、配列を取得したいがための数式なんですよね。
 
順を追っていきます。
配列は {} で括られた部分になります。
 
まず、解説ではレイアウトは提示されたものを前提とします。
 
      [A]
 [1]  123
 [2]  45
 [3]  78
 [4]  123
 [5]  78
 [6]  123
 [7]  659
 [8]  45
 [9]  45
 [10] 45
 
◆MATCH関数の戻り値について
 
MATCH(A1:A10,A1:A10,0) は上記レイアウトでは、A1の場合、A1でマッチしますので、1が返ります。
A2の場合、A2がマッチしますので、2が返ります。A3は省略。A4はA1でマッチしますので、1が返ります。
これを繰り返してA10まで行うと、下記のような配列が返ります。
 
{1,2,3,1,3,1,7,2,2,2}
 
 
◆ROW関数の戻り値について
 
ROW関数は行数を返す関数ですので、ROW(A1:A10) からは下記の配列が得られます。
 
{1,2,3,4,5,6,7,8,9,10}
 
 
◆MATCH(A1:A10,A1:A10,0)=ROW(A1:A10) の戻り値について
 
上記で得られたふたつの配列を比較した論理値が返ります。
 
 {1=1,2=2,3=3,1=4,3=5,1=6,7=7,2=8,2=9,2=10}
={True,True,True,False,False,False,True,False,False,False}
 
 
◆0/(MATCH(A1:A10,A1:A10,0)=ROW(A1:A10)) の戻り値について
 
以上より得られた配列を当てはめると、
 
0/({True,True,True,False,False,False,True,False,False,False})
 
となります。
論理値は四則演算ではTrue=1、False=0として扱われますので、これらは
 
0/({1,1,1,0,0,0,1,0,0,0})
 
と書くことができ、結果的に
 
{0,0,0,#DIV/0!,#DIV/0!,#DIV/0!,0,#DIV/0!,#DIV/0!,#DIV/0!}
 
となります。
 
INDEX関数は、配列を扱うための関数なので、特別なことはしていません。
 
=COUNT(INDEX({0,0,0,#DIV/0!,#DIV/0!,#DIV/0!,0,#DIV/0!,#DIV/0!,#DIV/0!},))
 
とすることにより、COUNT関数で計算の対象となるのは 0 のみですから、4が返ります。
 
(ROUGE)

 概ね理解する事ができました。丁寧で分かりやすかったです。
 本当にありがとうございました!

 (ポム)


 数値の重複は、このように=FREQUENCY()を利用するのもよいかもしれません。 (PENSIONER)

 =SUM(N(FREQUENCY(A1:A10,A1:A10)>1))


 =SUMPRODUCT(1/COUNTIF(A1:A6,A1:A6)*(COUNTIF(A1:A6,A1:A6)>1))

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.