2020年3月10日火曜日

地点あたりの種数算出

午前
・標本整理

午後
・論文書き(卒論論文化: マダニ)

昨日、悩んだ地点あたりの種数算出は、家に帰って考えたらアッサリ解決した。

データはこんな感じで、1行1個体で「site」列に地点、「spe」列に種名が書かれている。


例えば、地点ごとの個体数を算出するには下記でOK!
#データが「data_exu」に入ってるとして
tapply(data_exu$spe, data_exu$site, length)
場所ごとの種ごとの個体数ならば
tapply(data_exu$spe, list(data_exu$site, data_exu$spe), length)
で良い。

これは「site」ごとに分割して、「length」でその分割された行の数を数えていると考えると良い。

で、この方法を応用して、「site」ごとに分割して「nlevels」で分割されたデータの「spe」に含まれるFactor(種名)の数を数えれば良いと考えたのが昨日。
tapply(data_exu$spe, data_exu$site, nlevels)
なぜか、全て16になってしまう。16はデータに含まれる種数。


「factor()」とか試したけどダメ!

で、たどり着いたのが、「library(dplyr)」の「group_by」+「n_distinct」。

「group_by」は文字通りグループに分ける。で、「n_distinct」は「ユニーク数を数える(重複を除去して数える)」という機能。正にコレが欲しかった!
library(dplyr)
a <- data_exu %>% group_by(site) %>% summarize(n_spe = n_distinct(spe))
a
で良い、、、と思う。「group_by(site)」で「site」ごとに分けて、「spe」に含まれるユニーク数(種数)を数えて「n_spe」に返してくれる。


さらに、元データに外来種と在来種の情報を加えて、地点ごとの外来種と在来種の種数を調べたのが、これはさらに少し手を加える必要があった。