Help us understand the problem. What is going on with this article?

R初心者はこれを見ろ!便利なパッケージまとめ!入門編

More than 1 year has passed since last update.

Rの初心者におすすめなパッケージ

いろいろなパッケージがありますが、その中でも特によく使う!!というものをピック・アップしました。

data.table

まずはこれ。このパッケージのfreadは便利。
read.csvより遥かに読み込み速度が早くなるし、txtファイルでもok
a <- fread("hogehoge/hoge.csv")と使い方はread.csvと同じ!

dplyr

これもデータテーブルをいろいろ変数加工する際には必須といえるパッケージ。
filter, select, group_by, mutate, summariseあたりは抑えておきたいところ。

順番に見ていくと、
filterは下記から、BrandがABCのものだけ抜き出したいときに使えます。
購買データだと思ってください。
IDは顧客ID, Weeksは週(1週目~4週目のデータ), Brandは購入した商品のブランド名で、ABCとDEFは競合ブランドとご理解ください。

> table
  ID Weeks Brand
1  A     1   ABC
2  A     2   ABC
3  A     3   DEF
4  A     4   ABC
5  B     1   DEF
6  B     2   DEF
7  B     3   DEF
8  B     4   ABC
> df_ABC <- table %>% dplyr::filter(Brand == "ABC") 
> df_ABC
  ID Weeks Brand
1  A     1   ABC
2  A     2   ABC
3  A     4   ABC
4  B     4   ABC

### %>%はパイプ処理と呼ばれ、shift+ctrl+Mの同時押しで出せます!
### 下記と同意です
### df_ABC <- dplyr::filter(table, Brand == "ABC")

こんな具合に、条件にマッチした列だけを抜き出すことができます。

selectは列の選択。IDとBrandだけの列が欲しい場合に、

> df_ABC
  ID Weeks Brand
1  A     1   ABC
2  A     2   ABC
3  A     4   ABC
4  B     4   ABC
> df_ID_Brand <- table %>% dplyr::select(ID, Brand)
> df_ID_Brand
  ID Brand
1  A   ABC
2  A   ABC
3  A   DEF
4  A   ABC
5  B   DEF
6  B   DEF
7  B   DEF
8  B   ABC

また、下記でも同じことができます。

> df_ID_Brand <- table %>% dplyr::select(1, 3) #列番号でもOK
> df_ID_Brand
  ID Brand
1  A   ABC
2  A   ABC
3  A   DEF
4  A   ABC
5  B   DEF
6  B   DEF
7  B   DEF
8  B   ABC

selectを使わず、

> df_ID_Brand <- table[,-2] #2列目を除く
> df_ID_Brand
  ID Brand
1  A   ABC
2  A   ABC
3  A   DEF
4  A   ABC
5  B   DEF
6  B   DEF
7  B   DEF
8  B   ABC

としても今回は同じことができます。

group_by, mutate, summariseはまとめて説明しますと、
人毎(IDごと)にABCの購入回数を知りたい場合、

> table_2 <- table %>%
   dplyr::group_by(ID) %>% #IDごとに以下の処理が行われる
   dplyr::filter(Brand == "ABC") %>% #ABCだけのレコードにする
   dplyr::mutate(count_ABC = n()) #n()で列数を数える
> table_2
# A tibble: 4 x 4
# Groups:   ID [2]
  ID    Weeks Brand count_ABC
  <chr> <int> <chr>     <int>
1 A         1 ABC           3
2 A         2 ABC           3
3 A         4 ABC           3
4 B         4 ABC           1

#また、ID毎にABCの購入回数だけのテーブルにしたい場合は、
> table_2 <- table_2 %>%
  distinct(ID, .keep_all = TRUE) %>% #ID列で重複するレコードを削除、.keep_all = TRUEでID以外の列を保持
  dplyr::select(ID, count_ABC) #IDとcount_ABC列だけにする
> table_2
# A tibble: 2 x 2
  ID    count_ABC
  <chr>     <int>
1 A             3
2 B             1

summarisemutateと似ておりまして、mutateでは新たな列が追加されましたが、summariseではこうなります。

> table_2 <- table %>%
+   dplyr::group_by(ID) %>% 
+   dplyr::filter(Brand == "ABC") %>% 
+   dplyr::summarise(count_ABC = n())
> table_2
# A tibble: 2 x 2
  ID    count_ABC
  <chr>     <int>
1 A             3
2 B             1

違いがわかりますかね??mutateを再掲すると、

> table_2 <- table %>%
   dplyr::group_by(ID) %>% 
   dplyr::filter(Brand == "ABC") %>% 
   dplyr::mutate(count_ABC = n())
> table_2
# A tibble: 4 x 4
# Groups:   ID [2]
  ID    Weeks Brand count_ABC
  <chr> <int> <chr>     <int>
1 A         1 ABC           3
2 A         2 ABC           3
3 A         4 ABC           3
4 B         4 ABC           1

そう!summariseでは、tableに新たな列が追加されるのではなく、group_byで選択した列とsummariseで作成した列だけのデータテーブルが作成されるのです!

気が向きましたら、次はinner_jointidyrspread, gatherあたりをまとめようと思います。
お読みいただきありがとうございました。

Naka-u
20代後半に転職し、データ・サイエンティストとなりました。 統計等もガッツリ学んだことはなく、日々勉強です。 統計にしろ、RやPythonにしろ日々学んだことを書いていこうと思っております。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away