エクセルのピボットデーブルって便利ですよね。
Rで同じようなことやろうと思うとちょっと面倒、、、と思っていましたが、dplyrなら簡単でした。
エクセル同様、何も考えずにピボットテーブル的なものが作れます。
library(tidyverse) #まずはtidyverseを読み込む
# 出土遺物の一覧表をイメージしたデータフレームを作成
a<-c("中期","後期","晩期","晩期","中期","後期","後期","晩期","中期","晩期")
b<-c("厚沢部","江差","江差","厚沢部","江差","厚沢部","江差","江差","厚沢部","江差")
d<-c(18,21,6,32,8,15,2,21,17,7)
data<-data.frame(時期=a,地域=b,数量=d)
head(data) #こんな感じのデータ
時期 地域 数量
1 中期 厚沢部 18
2 後期 江差 21
3 晩期 江差 6
4 晩期 厚沢部 32
5 中期 江差 8
6 後期 厚沢部 15
group_by() %>% summarize() %>% spread() とデータを渡すとエクセルのピボットテーブルと同じものができます。
data%>%
group_by(時期,地域) %>% #goup_by()で時期と地域でグルーピング
summarize(出土点数=sum(数量)) %>% #summarize() で時期と地域ごとの出土点数を合計する
spread(地域,出土点数) #spread()で時期を縦軸、地域を横軸にとって出土点数の合計を一覧にする
# A tibble: 3 x 3
# Groups: 時期 [3]
時期 厚沢部 江差
<fct> <dbl> <dbl>
1 後期 15 23
2 中期 35 8
3 晩期 32 34
summarize()を平均(mean())とか個数(count = n())とかにしてやれば何でもできる。
補足
それぞれのプロセスでデータがどのように変形されているかをみてみる。
## 中期の厚沢部、後期の江差、、、というようにデータをグループ化して次の関数に渡している。
## 実は見た目は元のデータと変わらない。
data%>%
group_by(時期,地域) %>%
head()
# A tibble: 10 x 3
# Groups: 時期, 地域 [6]
時期 地域 数量
<fct> <fct> <dbl>
1 中期 厚沢部 18
2 後期 江差 21
3 晩期 江差 6
4 晩期 厚沢部 32
5 中期 江差 8
6 後期 厚沢部 15
##group_by()で指定されたフィールド(地域と時期)ごとに合計を算出して「出土点数」というフィールドに格納
%>% summarize(出土点数=sum(数量))
# A tibble: 6 x 3
# Groups: 時期 [?]
時期 地域 出土点数
<fct> <fct> <dbl>
1 後期 厚沢部 15
2 後期 江差 23
3 中期 厚沢部 35
4 中期 江差 8
5 晩期 厚沢部 32
6 晩期 江差 34
##引数で「地域」を指定し、「地域」を横軸にとった一覧表が完成
%>% spread(地域,出土点数)
# A tibble: 3 x 3
# Groups: 時期 [3]
時期 厚沢部 江差
<fct> <dbl> <dbl>
1 後期 15 23
2 中期 35 8
3 晩期 32 34