- filter( )で条件に該当する行を抽出する
- sample_n( )・sample_frac( )でランダムに抽出する
- distict( )で重複を取り除く
- arrange( )で順序どおりに並べ替える
- rownames_to_column( )で行番号を変数に追加する
- おわりに
- 参考資料
行、つまり観察単位に対する操作のまとめ。
survivalパッケージのpbcデータセットを例として使う。
> library(survival) > set.seed(1234) > data(pbc) > d <- pbc[1:6, 1:6] > d[6, 2:6] <- NA > d id time status trt age sex 1 1 400 2 1 58.76523 f 2 2 4500 0 1 56.44627 f 3 3 1012 2 1 70.07255 m 4 4 1925 2 1 54.74059 f 5 5 1504 1 2 38.10541 f 6 6 NA NA NA NA <NA>
6症例、6変数のみ抽出し、症例6はID以外は欠測値とした。
tidyverseパッケージを読み込んでおく。
library(tidyverse)
filter( )で条件に該当する行を抽出する
条件を指定するための論理記号には次のようなものがある。
==
:一致する>
,<
:より大きい・小さい>=
,<=
:以上・以下between()
:例えば条件をbetween(x, 5, 10)とすると、変数xが5以上10以下の範囲にある行が抽出される。!=
:一致しない(!は否定の意味)is.na()
:欠測(NA)であるもの!is.na()
:欠測でないもの(上の否定形)%in%
:リストに含まれるかどうか。例えば条件をx %in% c(a, b, c)とすると、変数xの値がリストa, b, cのどれかに一致する行が抽出される。
複数条件を組み合わせるためには、
A & B
:AかつBA | B
:AまたはBxor(A, B)
:どちらか一方のみを満たす
> d %>% filter(sex=="m") id time status trt age sex 1 3 1012 2 1 70.07255 m
sample_n( )・sample_frac( )でランダムに抽出する
無作為抽出が必要となる状況は、
- データが大きいので一部を使って探索的に解析したいとき
- ブートストラップサンプルを作りたいとき
があるが、後者はおそらく別のパッケージ(bootなど)を使うことになるだろう。
抽出数で指定するときはsample_n()
、抽出割合で指定するときはsample_frac()
を使う。
引数replace=TRUE
とすると同一症例の重複抽出を許すことになる。
> d_dup <- d %>% sample_frac(size=1, replace=TRUE) > d_dup id time status trt age sex 1 2 4500 0 1 56.44627 f 2 6 NA NA NA NA <NA> 3 5 1504 1 2 38.10541 f 4 1 400 2 1 58.76523 f 5 3 1012 2 1 70.07255 m 6 3 1012 2 1 70.07255 m
症例3が重複して抽出されている。
distict( )で重複を取り除く
先程作成したd_dup
で見られていた症例3の重複を取り除く。
> d_dup %>% distinct() id time status trt age sex 1 2 4500 0 1 56.44627 f 2 6 NA NA NA NA <NA> 3 5 1504 1 2 38.10541 f 4 1 400 2 1 58.76523 f 5 3 1012 2 1 70.07255 m
top_n( )で順序をもとに抽出する
age
が大きい人上位3例を抽出する。
> d %>% top_n(n=3, age) id time status trt age sex 1 1 400 2 1 58.76523 f 2 2 4500 0 1 56.44627 f 3 3 1012 2 1 70.07255 m
逆順にしたい場合は-age
またはdesc(age)
を指定する(結果割愛)。
d %>% top_n(n=3, -age) d %>% top_n(n=3, desc(age))
arrange( )で順序どおりに並べ替える
降順にしたいときは前述のとおり-age
またはdesc(age)
を使う。
> d %>% arrange(age) id time status trt age sex 1 5 1504 1 2 38.10541 f 2 4 1925 2 1 54.74059 f 3 2 4500 0 1 56.44627 f 4 1 400 2 1 58.76523 f 5 3 1012 2 1 70.07255 m 6 6 NA NA NA NA <NA>
rownames_to_column( )で行番号を変数に追加する
例えば年齢順に番号を振りたい時に使う。
年齢順に並べ替えた後で行番号を変数にすればよい。
d %>% arrange(age) %>% rownames_to_column(var="age_order")
age_order id time status trt age sex 1 1 5 1504 1 2 38.10541 f 2 2 4 1925 2 1 54.74059 f 3 3 2 4500 0 1 56.44627 f 4 4 1 400 2 1 58.76523 f 5 5 3 1012 2 1 70.07255 m 6 6 6 NA NA NA NA <NA>
おわりに
- どんな操作をするのか図にかいてみると理解が捗るかもしれません。
- ちゅ〜る(猫用おやつ)には何か特別なものが入っているんでしょうか。いつも我を忘れて食べてます。
参考資料
前田和寛(@kazutan)先生のページ。とてもわかりやすくまとめていただいてます。 kazutan.github.io
本家ページ dplyr.tidyverse.org