見出し画像

【2-2】Rで特定の列や行を抽出するselect(), filter(), slice()の使い方

はじめに

 Rで集計やグラフ作成を行う場面は多くあります。

その際、元の表から分析に使いたい列や行だけを抽出したり、「男性だけを取り出す」みたいに様々な条件にあった行だけを抽出することが必要になります

今回はRで指定した列や行だけを取り出すselect関数、slice関数、filter関数を紹介します。
これらはtidyverseパッケージ内にあるdplyrパッケージの機能です。

パッケージとデータの準備

#pacmanパッケージがあるかを確認。なければinstall.packagesパッケージをインストール
if (!require("pacman")) install.packages("pacman")

#今回使うパッケージ
pacman::p_load(dplyr, rio)

#データの準備
url <- "https://mitti1210.livedoor.blog/data.xlsx"
data <- import(url, which = "入院", skip = 2)
head(data)

selectとfilterのイメージ

select()

dplyr::select()はエクセルの特定の列のみを抽出したり並べ替えたりできます。選択方法は1つずつ選ぶ方法もあれば条件にある列を選ぶ方法など色々あります。

filter()

dplyr::filter()は条件式を使い、条件に合った行を抽出する関数です。

それとどの関数もそうですがselect()やfilter()を使った時点で元の変数が更新されることはありません。抽出された新たなdata.frameが作られたというイメージです。なので新しい変数名に入れないとただ抽出しただけで保存されません。元のdata.frameの変数名に入れると更新されます。

slice()

slice()はselect()の行バージョンみたいなイメージで、条件ではなく指定した行を抽出します。silce関数は300万桁あって処理に時間かかるから、いきなり全部使わず1000行や偶数行だけを抽出して、プログラムが動くかどうかテストしてみようみたいな場合に使えます。他にもブートストラップ法みたいに特定の行をランダムに抽出することも可能です。

select()の使い方

基本的な使い方

#基本的な使い方1
#select(data.frameの変数名, 抽出したい列名)

temp <- select(data, 時期, id, testA_1, testA_2, testA_3, testA_4)

head(temp)
#基本的な使い方2
#data.frameの変数名 %>%
#  select(抽出したい列名)

temp <- 
  data %>% #もしくは data |>
  select(時期, id, testA_1, testA_2, testA_3, testA_4)

head(temp)

基本的な使い方は1の書き方ですが直感的には2の書き方の方がわかりやすいと思います。%>% もしくは |>パイプ演算子といい、1つ前の結果を使ってというイメージになります。ここではdata %>% select(…)となっているのでdataのデータをそのまま使ってねという意味合いになります。Rはパイプ演算子がとにかく便利という特徴があるので今のうちに慣れていきましょう。

列選択の方法

列選択の方法は色々あります。1-8を組み合わせるとかなり自由に

1.列名を直接使う

data %>%
  select(時期, id, testA_1, testA_2, testA_3, testA_4)

2.列番号を使う

data %>%
  select(1, 2, 6, 7, 8, 9)

#列番号が知りたいときはnames関数を使う
names(data) %>% t()

3.列が連続している時は:を使うと間が省略できる

data %>%
  select(時期, id, testA_1:testA_4)

4.特定の文字で始まる場合はstarts_with()が使える

#starts_with()の中はcharacter型のため""が必要
data %>%
  select(1:2, starts_with("testA"))

5.特定の文字で終わる場合はends_with()が使える

#ends_with()の中はcharacter型のため""が必要
data %>% 
  select(1:2, ends_with("日"))

6.列名に特定の文字が入っている場合はcontains()が使える

#contains()の中はcharacter型のため""が必要
data %>%
 
  select(1:2, contains("A"))

7.特定の型を抽出するにはwhere()が使える

#where()の中はis.**の関数名になる
data %>%
  select(1:2, where(is.numeric)) #numeric型の場合

data %>% 
  select(1:2, where(is.character)) #character型の場合

8.いらない列を外すときは - や ! が使える

data %>%
  select(-3, -4, -5, -10:-13)

data %>%
  select(!c(3:5, 10:13))

9.上記の1-8は組み合わせ可能

data %>%
  select(時期, 2, testA_1, 7, testA_3, 9)

data %>%
  select(where(is.numeric), -id)

filter()の使い方

条件式を作る必要がありますので不安な場合は第1章を復習してください。

基本的な使い方

考え方はselect()と同じ
data %>%
  filter(testC >=3)
    #testCが3以上の場合

data %>% 
  filter(id %in% c(3, 5:7, 10))
  #idが3, 5, 6, 7, 10の場合

data %>% 
  filter(入院日 > "2022-04-01")
  #入院日が2022-04-01日より後の場合

data %>% 
  filter(入院日 >= "2022-04-01" & 入院日 < "2022-05-31"  & testC >=4)
  #入院日が2022-04-01以上、2022-05-01より前、かつtestCが4以上の場合

data %>%
  filter(between(id, 3, 10))
  #between()はdplyrパッケージの関数。idが3以上10以下の場合

slice()の使い方

#seq(はじめの数値, 終わりの数値, いくつ飛びか)
seq(1, 20, 2) #結果は1-20までの奇数になる

data %>% 
  slice(seq(1, 20, 2))

組み合わせる

data %>%
  select(1:2, contains("A")) %>%  #1-2行目と"A"を含む列を選択
  filter(testA_1 > 2)             #testA_1が2より大きい行を選択

まとめ

select(), filter()、次回紹介するmutate()の3つは自分でデータ分析を行う場合、本当によく使う関数になります。使いながら慣れてみてください。

この記事が気に入ったらサポートをしてみませんか?