ねこすたっと

ねこの気持ちと統計について悩む筆者の備忘録的ページ。

データ行に対する操作(tidyverseパッケージ)[R]

行、つまり観察単位に対する操作のまとめ。

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( )で条件に該当する行を抽出する

図1: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かつB
  • A | B:AまたはB
  • xor(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など)を使うことになるだろう。

図2:sample_n( ), sample_frac( )

抽出数で指定するときは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( )で重複を取り除く

図3:distinct( )

先程作成した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( )で順序どおりに並べ替える

図4:top_n( ), 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( )で行番号を変数に追加する

図5: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>

おわりに

  • どんな操作をするのか図にかいてみると理解が捗るかもしれません。
  • ちゅ〜る(猫用おやつ)には何か特別なものが入っているんでしょうか。いつも我を忘れて食べてます。

参考資料