(以前の記事をtidyverseで作り直してみました。まだ旧来のRコードの方が馴染みがあるので、tidyverseに慣れている方からすると不格好かもしれません。)
多数の種が含まれる生物群集データを解析する時、エクセルなどにデータを整理していると、各種をインデックスにするか要因のひとつとして整理するか、ケースによって変わってくるかと思います。とくに各種を応答変数とするか説明変数に使用するかあたりで必要になってくるかと。完全なデータフレーム型にしておいた方が統計解析はやりやすいけれど、膨大な行数となってエクセルの限界にあっさりと到達したりもするし…(cf. エクセルのvlookup関数)。
こんな時に、一部集計データとデータフレーム型とを自在に一発変換できたら効率がよいと思い、やり方をまとめてみました。正直、入力の手間が一番省けるのは部分的には集計されたデータだったりしますよね(下記のdata1のような形)。
data1 <- tibble(
year = c(rep("y08", 3), rep("y09", 3)),
site = c(1:3, 1:3),
depth = seq(1, 5, length=6),
sp1 = c(6:1), sp2 = c(1:6), sp3 = c(0:5))
# 出力するとこんな感じです。<chr>は文字型、<int>は整数型、<dbl>は連続変数型を示す。
> data1
########################################################
data2 <- data1 %>% pivot_longer(c(-year, -site, -depth), names_to="species", values_to="abundance")
> data2 # 出力してみます
########################################################
# もう一段階、伸ばしてみましょう。一個体あたり一行というデータセットへ。多項ロジットなど、カテゴリカルな解析に便利そうです。
data3 <- select(data2, -abundance) %>% slice(unlist(map2(1:nrow(data2), data2$abundance, rep)))
> data3
########################################################
data4 <- data3 %>% count(year, site, depth, species, name="abundance")
########################################################
data5 <- data4 %>% pivot_wider(names_from=species, values_from=abundance, values_fill=0)
# pivot_widerは縦長データから横長データへ変換する、見出しとなるspeciesと対応する値abundanceを展開する。生じるNAはvalues_fill=0で置き換えた。
> data5 # 出力してみます。
########################################################
data6 <- tibble(site=paste0("s", 1:10), month=rep(c(1:2), each=5),
species=c("スズメ", "","スズメ、ヒヨドリ、シジュウカラ", "ムクドリ、スズメ", "ヒヨドリ、スズメ", "スズメ、キジバト", "スズメ、ムクドリ", "スズメ、ヒヨドリ", "", "ムクドリ"))
# 例えばこんなかんじのデータセット。空欄さえあります…
sptabs <- data6 %>% # data6をベースに集計作業
data7 # 出力してみます(出来上がり)