*disclaimer
815796
dplyr
- dplyr
- %>% でパイプ処理
- filter()
- レコードにフィルターをかけて、必要なレコードだけを選び出す
- 複数の条件は、カッコ内に条件を並べる。
- 二つのどちらかに合う場合は | で併記
- %in% で左右に並べることで、左の中のレコードで右側のどれかに該当するものを選ぶ
- 該当しないものを選ぶ(上の「否定」):複数のものを除く場合
- 特定の行を削除するには != で該当しないものを残せばよい
- NICER1.1の言語特徴量データフレームから、特定のトピックだけを抜き出す
- select()
- mutate()
- mutate(付け足すカラム名 = 変換操作)
- 定型文字列を一列つけるには
- 条件によって、文字列を変えるには if_else を使う
- 付け足さずに、置き換えることもできる。(データフレーム内の置き換え)
- 行で集計する apply とオプションの1
- top_n(上位何位まで, カラム名)
- arrange()
- rename()
- relocate()
- full_join()
- データフレームの縦横結合
- select()
- pull()
- group_by()
- summarise(見出し=命令())
- 使用例
- summarise_each()
- summarise_all()
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")
二つのどちらかに合う場合は | で併記
filter(fruit=="apple" | fruit=="orange")
%in% で左右に並べることで、左の中のレコードで右側のどれかに該当するものを選ぶ
- 左側がデータフレームで、その中の見出しに含まれるもののうち、特定の該当するものについて、ベクトルにまとめてあるものを右側にして、該当するものだけのレコードを抽出する。
df %>% filter(id %in% hit)
該当しないものを選ぶ(上の「否定」):複数のものを除く場合
- 該当するものを指定して、その前に ! を付ければ、その否定になる
- 26と38に該当するもの
month %in% c(26,38)
- その否定
filter(!(month %in% c(26,38)))
- 事前に除くもののリストを作っておいて
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()
グループごとにまとめて集計する
一つのIDから複数回にわたって、各種データを取った場合に、IDごとにデータを足し合わせてまとめる場合などに。
- 例:一つのIDで3回、A,B,Cの3項目のデータを取った場合
ID A B C 1 7 6 9 1 8 2 6 1 4 2 3 2 5 0 9 2 4 2 4 2 3 6 2 3 6 7 8 3 1 7 5 3 5 7 8 4 1 10 6 4 2 5 9 4 8 8 5 5 3 4 10 5 4 1 9 5 9 7 8
- 以下のようなスクリプトで
sample.dat.sum <- sample.dat %>% group_by(ID) %>% summarise( Sum_A = sum(A), Sum_B = sum(B), Sum_C = sum(C), )
- 以下のように集計できる
ID | Sum_A | Sum_B | Sum_C |
---|---|---|---|
1 | 19 | 10 | 18 |
2 | 12 | 8 | 15 |
3 | 12 | 21 | 21 |
4 | 11 | 23 | 20 |
5 | 16 | 12 | 27 |
- 二つ(以上)指定して、入れ子にすることも可能。
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()
集計の二通り
SbyS.dat2 %>% group_by(PID, Year) %>% summarise(across(MDD:SL, mean)) SbyS.dat2b %>% group_by(PID, Year) %>% summarise( mdd_person=mean(MDD), mhd_person=mean(MHD), om_person=mean(Omega), SL_person=mean(SL) )
summarise_each()
summarise_all()
- 行ではなく、列単位に命令を実行できる
- 例:列ごとに、集計結果を加える
summarise_all(sum)
- オプションで、na.rm = T をつけておくと、欠損値を除いて処理してくれる。
https://sugiura-ken.org/wiki/