LoginSignup
7
14

More than 5 years have passed since last update.

Rとdplyrでピボットテーブル

Posted at

エクセルのピボットデーブルって便利ですよね。
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
7
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
14