トップ 履歴 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

dplyr

*disclaimer
603235

R
R.package

dplyr


library(dplyr)

  %>% でパイプ処理

  • 左の命令の結果を、右の命令に受け渡す
    • 入れ子型に丸かっこで何重に入れこまなくても
mean(head(women$height))
    • ステップごとに分けて書けるので、見やすい。
head(women$height) %>% mean

キーボード・ショートカット Ctrl+Shift+M



 filter()

レコードにフィルターをかけて、必要なレコードだけを選び出す

> ToothGrowth %>% filter(supp=="VC") %>% head()
   len supp dose
1  4.2   VC  0.5
2 11.5   VC  0.5
3  7.3   VC  0.5
4  5.8   VC  0.5
5  6.4   VC  0.5
6 10.0   VC  0.5
> ToothGrowth %>% filter(supp=="OJ") %>% head()
   len supp dose
1 15.2   OJ  0.5
2 21.5   OJ  0.5
3 17.6   OJ  0.5
4  9.7   OJ  0.5
5 14.5   OJ  0.5
6 10.0   OJ  0.5
> ToothGrowth %>% filter(supp!="OJ") %>% head()
   len supp dose
1  4.2   VC  0.5
2 11.5   VC  0.5
3  7.3   VC  0.5
4  5.8   VC  0.5
5  6.4   VC  0.5
6 10.0   VC  0.5
> ToothGrowth %>% filter(dose==1.0) %>% head()
   len supp dose
1 16.5   VC    1
2 16.5   VC    1
3 15.2   VC    1
4 17.3   VC    1
5 22.5   VC    1
6 17.3   VC    1
> ToothGrowth %>% filter(dose>1.0) %>% head()
   len supp dose
1 23.6   VC    2
2 18.5   VC    2
3 33.9   VC    2
4 25.5   VC    2
5 26.4   VC    2
6 32.5   VC    2
> ToothGrowth %>% filter(dose<1.0) %>% head()
   len supp dose
1  4.2   VC  0.5
2 11.5   VC  0.5
3  7.3   VC  0.5
4  5.8   VC  0.5
5  6.4   VC  0.5
6 10.0   VC  0.5

複数の条件は、カッコ内に条件を並べる。

filter(doc_id == "text1" , sentence_id == 2)


%in% で左右に並べることで、左の中のレコードで右側のどれかに該当するものを選ぶ

  • 左側がデータフレームで、その中の見出しに含まれるもののうち、特定の該当するものについて、ベクトルにまとめてあるものを右側にして、該当するものだけのレコードを抽出する。
df %>% filter(id %in% hit)

該当しないものを選ぶ(上の「否定」):複数のものを除く場合


  • 事前に除くもののリストを作っておいて
nozoku <- c("iranai","hosikunai")
  • それを否定で指定する
filter(!(全体リスト %in% nozoku))

df %>% filter(!(id %in% hit))
  • hitの部分は以下のようでも可
filter(!(ID %in% c(1805, 1816, 1817, 1866, 1916, 1925, 1927, 1936, 1938, 2022, 2045, 2049)))

特定の行を削除するには != で該当しないものを残せばよい

NP.dat.jp2b <- NP.dat.jp %>% filter(Group != "Am")
  • しかし、これだと、GroupにAmというレベルが残ったままになる。
  • 使ってないレベルを削除するのは droplevels()
NP.dat.jp2c <- droplevels(NP.dat.jp2)

NICER1.1の言語特徴量データフレームから、特定のトピックだけを抜き出す

> head(JPNindexTopic.b)
        file     Topic Score Token Type NoS       TTR       GI     MATTR      AWL      ASL
1 JPN501.txt    sports     4   994  260 123 0.2615694 8.246699 0.4919115 3.888330 8.081301
2 JPN502.txt education     4   997  283 120 0.2838516 8.962700 0.5160281 3.925777 8.308333
3 JPN503.txt education     3   561  207  70 0.3689840 8.739547 0.5566488 4.247772 8.014286
4 JPN504.txt    sports     4   817  245 114 0.2998776 8.571465 0.4998409 4.057528 7.166667
5 JPN505.txt    sports     4  1024  274 106 0.2675781 8.562500 0.5182812 3.676758 9.660377
6 JPN506.txt     money     3   638  197  93 0.3087774 7.799305 0.5082132 3.578370 6.860215
> filter(JPNindexTopic.b, Topic=="education")
         file     Topic Score Token Type NoS       TTR       GI     MATTR      AWL       ASL
1  JPN502.txt education     4   997  283 120 0.2838516 8.962700 0.5160281 3.925777  8.308333
2  JPN503.txt education     3   561  207  70 0.3689840 8.739547 0.5566488 4.247772  8.014286
3  JPN507.txt education     4  1033  274 111 0.2652469 8.525118 0.5251210 3.861568  9.306306
4  JPN510.txt education     3   575  201  72 0.3495652 8.382279 0.5297391 3.951304  7.986111
5  JPN511.txt education     5  1034  275 130 0.2659574 8.552093 0.5323211 4.088008  7.953846
6  JPN512.txt education     5  1146  300 120 0.2617801 8.861943 0.5177574 4.279232  9.550000



 select()

特定のカラムだけ抽出

errdat5 <- select(errdat4, M.OTHER, R.OTHER, U.OTHER)

errdat4の中から、M.OTHER, R.OTHER, U.OTHERの三種類のカラムだけ選ぶ

> head(select(errdat4, M.OTHER, R.OTHER, U.OTHER))
    M.OTHER   R.OTHER  U.OTHER
1 0.0000000 23.437500 1.875000
2 4.1782730 16.713092 4.178273
3 0.0000000 11.940299 1.492537
4 3.4615385 19.615385 0.000000
5 0.7142857  8.571429 3.571429
6 0.0000000 11.494253 2.298851

特定のカラムを含まない残りを抽出

  • 含めたくないものの列名にマイナスをつけて並べる
errdat5 <- select(errdat4, -M.OTHER, -R.OTHER, -U.OTHER)

> head(select(errdat4, -M.OTHER, -R.OTHER, -U.OTHER))
  Criterion     M.ADJ     M.ADV M.CONJ M.CONTR     M.DET   M.NOUN M.NOUN.POSS    M.PART   M.PREP    M.PRON  M.PUNCT   M.VERB
1         4 0.0000000 0.9375000      0       0 0.9375000 0.000000           0 0.0000000 2.812500 0.0000000 1.875000 0.000000
2         4 0.8356546 0.8356546      0       0 6.6852368 0.000000           0 0.8356546 2.506964 0.0000000 3.342618 0.000000
3         3 0.0000000 2.9850746      0       0 1.4925373 0.000000           0 0.0000000 1.492537 0.0000000 0.000000 0.000000
4         4 1.1538462 1.1538462      0       0 1.1538462 1.153846           0 0.0000000 0.000000 0.0000000 2.307692 1.153846
5         4 0.7142857 0.0000000      0       0 0.7142857 0.000000           0 0.0000000 1.428571 0.7142857 5.000000 0.000000
6         3 0.0000000 2.2988506      0       0 1.1494253 0.000000           0 0.0000000 2.298851 0.0000000 0.000000 0.000000

 mutate()

mutate(付け足すカラム名 = 変換操作)

> head(ToothGrowth)
   len supp dose
1  4.2   VC  0.5
2 11.5   VC  0.5
3  7.3   VC  0.5
4  5.8   VC  0.5
5  6.4   VC  0.5
6 10.0   VC  0.5
> ToothGrowth %>% mutate(result = len * dose) %>% head()
   len supp dose result
1  4.2   VC  0.5   2.10
2 11.5   VC  0.5   5.75
3  7.3   VC  0.5   3.65
4  5.8   VC  0.5   2.90
5  6.4   VC  0.5   3.20
6 10.0   VC  0.5   5.00
  • 結果を保存するには、普通に左辺に代入すればよい
ToothGrowthResult <- ToothGrowth %>% mutate(result = len * dose)

定型文字列を一列つけるには

mutate(Lang = "JP")

  • 操作によるが、単につけるだけなら、pasteを使ってもできる。
jp2gram$bigram <- paste(jp2gram$first, jp2gram$second)


条件によって、文字列を変えるには if_else を使う

  • mutate(Lang = if_else(判断もとの列名==条件,入力文字,それ以外の場合に入力する文字)
mutate(Lang = if_else(year=="jp", "L1", "L2"))
    • yearの列がjpだったらLangにL1といれて、jp以外だったらL2と入れる

  • 例:正規表現を使った例
    • str_detect()を使う
PT.dat2 %>% mutate(Year = if_else(str_detect(KID, "^19"), 3, if_else(str_detect(KID, "^20"), 2, 1)))
    • 学籍番号が19で始まる場合は、Year=3
    • 学籍番号が20で始まる場合は、Year=2
    • その他の場合(学籍番号が21で始まる)は、Year=1

付け足さずに、置き換えることもできる。(データフレーム内の置き換え)


SbyS.datN <- SbyS.dat %>% mutate(Year=gsub("NS", "4", Year))
  • Yearというカラムに、2と3とNSと入っているところ、NSを4に置き換える

行で集計する apply とオプションの1

  • 例:3列目から62列目までの数値を合計(sum)して、totalというカラムを最後に追加する。
data %>% mutate(total = apply(data[, c(3:62)], 1, sum))

 top_n(上位何位まで, カラム名)

  • 順位を指定しても、タイがある場合は、該当するもの全部
  • 上位を出してくれるが、並べ替えはしてくれない(並べ替えは、下の arrange())
> dim(YNUJ4_19)
[1] 2760    4
> head(YNUJ4_19)
  SL      MHD      MDD       diff
2  5 1.750000 1.750000  0.0000000
3  7 1.666667 1.833333 -0.1666667
4  5 1.250000 2.250000 -1.0000000
5 11 2.400000 1.700000  0.7000000
6  9 2.375000 1.625000  0.7500000
9  4 2.000000 1.000000  1.0000000
> YNUJ4_19 %>% top_n(5, MHD)
  SL      MHD      MDD     diff
1 17 5.062500 1.562500 3.500000
2 15 5.285714 1.285714 4.000000
3 19 5.055556 2.000000 3.055556
4 13 5.083333 1.333333 3.750000
5 19 5.111111 1.611111 3.500000
> YNUJ4_19 %>% top_n(5, SL)
   SL      MHD      MDD       diff
1  19 2.111111 3.055556 -0.9444444
2  19 4.611111 2.888889  1.7222222
3  19 3.000000 2.388889  0.6111111
4  19 4.777778 1.611111  3.1666667
5  19 2.111111 2.833333 -0.7222222
6  19 4.000000 2.222222  1.7777778
7  19 2.722222 2.388889  0.3333333
8  19 3.055556 2.722222  0.3333333
9  19 3.500000 1.666667  1.8333333
10 19 4.388889 1.555556  2.8333333
11 19 2.833333 2.833333  0.0000000
12 19 2.277778 3.000000 -0.7222222
13 19 5.055556 2.000000  3.0555556
14 19 5.111111 1.611111  3.5000000
15 19 2.611111 2.888889 -0.2777778
16 19 3.111111 2.388889  0.7222222
17 19 3.222222 2.611111  0.6111111
18 19 3.222222 2.222222  1.0000000
19 19 3.611111 2.388889  1.2222222

下位から選ぶ場合は、マイナスをつける

> YNUJ4_19 %>% top_n(-5, diff)
  SL      MHD      MDD      diff
1 12 1.727273 3.909091 -2.181818
2  9 1.375000 3.875000 -2.500000
3 10 1.222222 3.777778 -2.555556
4 10 1.333333 3.666667 -2.333333
5 12 1.181818 5.000000 -3.818182
> tail(YNUJ4_19 %>% arrange(desc(diff)), 5)
     SL      MHD      MDD      diff
2756 12 1.727273 3.909091 -2.181818
2757 10 1.333333 3.666667 -2.333333
2758  9 1.375000 3.875000 -2.500000
2759 10 1.222222 3.777778 -2.555556
2760 12 1.181818 5.000000 -3.818182

 arrange()

昇順

降順は arrange(desc())

> YNUJ4_19 %>% top_n(5, MHD) %>% arrange(MHD)
  SL      MHD      MDD     diff
1 19 5.055556 2.000000 3.055556
2 17 5.062500 1.562500 3.500000
3 13 5.083333 1.333333 3.750000
4 19 5.111111 1.611111 3.500000
5 15 5.285714 1.285714 4.000000
> YNUJ4_19 %>% top_n(5, MHD) %>% arrange(desc(MHD))
  SL      MHD      MDD     diff
1 15 5.285714 1.285714 4.000000
2 19 5.111111 1.611111 3.500000
3 13 5.083333 1.333333 3.750000
4 17 5.062500 1.562500 3.500000
5 19 5.055556 2.000000 3.055556
> YNUJ4_19 %>% top_n(5, MHD) %>% arrange(desc(SL))
  SL      MHD      MDD     diff
1 19 5.055556 2.000000 3.055556
2 19 5.111111 1.611111 3.500000
3 17 5.062500 1.562500 3.500000
4 15 5.285714 1.285714 4.000000
5 13 5.083333 1.333333 3.750000

> YNUJ4_19 %>% arrange(desc(MHD)) %>% top_n(10, MHD)
   SL      MHD      MDD     diff
1  15 5.285714 1.285714 4.000000
2  19 5.111111 1.611111 3.500000
3  13 5.083333 1.333333 3.750000
4  17 5.062500 1.562500 3.500000
5  19 5.055556 2.000000 3.055556
6  13 5.000000 1.916667 3.083333
7  14 5.000000 1.384615 3.615385
8  15 4.928571 1.642857 3.285714
9  13 4.833333 1.250000 3.583333
10 13 4.833333 1.833333 3.000000

 rename()

カラム名を変更

rename(データ, 新しい名前=元の名前)
  • 同時に複数変更
rename(データ, 新しい名前=元の名前, 新しい名前2=元の名前2)
  • 変えたいところだけ指定すればよい
    • 標準のcolnames()だと、全部指定しないといけない


 relocate()

カラムを並べる順序を変える

  • 順番に前から指定する(指定されないものはもとのまま)
relocate(データフレーム, 一番前に来る見出し)
relocate(データフレーム, 一番前に来る見出し, 二番目)
relocate(データフレーム, 一番前に来る見出し, 二番目, 三番目)
  • 特定の場所に入れる
    • あるものの前
 relocate(データフレーム, 動かす見出し, .before=あるもの)
    • あるものの後
 relocate(データフレーム, 動かす見出し, .after=あるもの)


 full_join()

二つのデータフレームを一つに統合する。

  • 統合するキーを設定して、それをもとに、それぞれ該当がないところはNAとする。

二種類の頻度表を合わせて比較できるようにする

> df.ns <- read.delim("clipboard")

> df.ns
    bigram freq
1   of the  400
2   in the  200
3  at the   100
4 you know   50
5   i know   25

> df.nns <- read.delim("clipboard")

> df.nns
    bigram freq
1   of the  300
2  i think  250
3 you know  200
4   in the   30
5   i know   20

> full_join(df.ns, df.nns, by = "bigram")
    bigram freq.x freq.y
1   of the    400    300
2   in the    200     30
3  at the     100     NA
4 you know     50    200
5   i know     25     20
6  i think     NA    250


 データフレームの縦横結合


データフレームの縦結合: dplyr::bind_rows

  • 2つ以上もOK

データフレームの横結合: dplyr::bind_cols

  • 2つ以上もOK


 select()

  • カラムの選択

オプションとして

matches()

  • 正規表現で列名の指定ができる。

starts_with()


ends_with()


contains()


 pull()

  • 選択したカラムの値をベクトルで取り出す

 group_by()

  • グループごとにまとめて集計する
  • 二つ(以上)指定して、入れ子にすることも可能。
both2103.dat %>% 
  group_by(mode,year) %>% 
  summarise(across(N:IPSyn13, c(mean, sd)))
    • 話し言葉か書き言葉かというmodeで分けてから、学年yearで分けて、NからIPSynまでの、平均とSDを出す。

ungroup(データ)

  • 分類し終わったら、ungroupしておかないと、いつまでも分けられた状態のデータになったまま。


 summarise(見出し=命令())

  • 集計する
spoken134.dat %>% group_by(year) %>% summarise(平均=mean(Voc*2000), 標準偏差=sd(Voc*2000), 個数=n())

year        平均         標準偏差     個数

1	1433.721	276.61236	43	
2	1662.245	161.86756	49	
3	1833.333	 88.11485	42

  • 欠損値があると結果が出ない
    • その前に、na.omit() しておく。
    • もしくは、オプション na.rm=T をつけて
    summarise(平均=mean(Score, na.rm = T), 標準偏差=sd(Score, na.rm = T))
    • 関係ないカラムは、select(-不要カラム名, -不要カラム名) で除いておく

  • 参考

https://izunyan.github.io/gisho12/summarise.html
https://www.jaysong.net/RBook/datahandling2.html

 使用例

月ごとに分けて概要をまとめる。

  • group_by() %>% summarise()


 summarise_each()