SlideShare a Scribd company logo
1 of 28
Download to read offline
第7回 R言語勉強会
信州大学 久保琢也
2021年1月8日
今後の予定
回 日程 内容 パッケージ
第1回 10/16 イントロ -
第2回 10/30 ベクトル -
第3回 11/13 データフレームの操作① base
第4回 11/27 データフレームの操作② dplyr
第5回 12/11 データフレームの操作③ dplyr
第6回 12/25 文字列処理① stringr
第7回 01/08 文字列処理② stringr
休み 01/22 RA協議会法人化の説明会のため
第8回 02/05 データフレームの操作④ dplyr, tidyr
第9回 02/19 グラフ化① ggplot2
第10回 03/05 グラフ化② ggplot2
stringrによる
文字列処理②
事前の準備をお願いします
❖ KAKENより採択課題情報ダウンロード
− 期間:2018年∼2020年
− 種目:基盤研究(A)
− 形式:CSVファイル
https://kaken.nii.ac.jp
パッケージ
❖ パッケージのインストール
❖ パッケージの呼び出し
library( dplyr ) # パイプ演算子使うため
library( readr ) # データの読み書き
library( stringr ) # 文字列処理
install.packages( stringr )
作業ディレクトリの設定
❖ 作業ディレクトリの設定をお願いします
− 右下のパネルのFilesもしくは「…」でフォルダを選択
− インポートしたいファイルがあることを確認
− 「More」⇨「Set As Working Directory」
作業ディレクトリの設定
❖ 作業ディレクトリ/ファイルの確認
# 作業ディレクトリの確認
getwd( )
# 作業ディレクトリ内のファイルの確認
list.files( )
データのインポート(以下のどちらか)
❖ read_csv( )関数
❖ read.csv( )関数
# csvファイルの読み込み
d0 <- read_csv( kibanA.csv )
# d0の中身を確認
d0
# csvファイルの読み込み
d0 <- read.csv( kibanA.csv )
# d0の中身を確認
d0
前準備
❖ 必要な列をベクトルとして取り出す
# 審査区分ベクトル
area <- d0 %>%
slice( 1 : 50 ) %>%
pull( 審査区分 )
# 研究代表者ベクトル
pi <- d0 %>%
slice( 1 : 50 ) %>%
pull( 研究代表者 )
正規表現とは
中区分 1 :思想、芸術およびその関連分野
中区分 2 :文学、言語学およびその関連分野
中区分 3 :歴史学、考古学、博物館学およびその関連分野
… … …
… … …
中区分 63 :環境解析評価およびその関連分野
中区分 64 :環境保全対策およびその関連分野
❖文字列のパターンに関する記法
「数字が1回以上続く文字列」と捉える
このパターンをRの正規表現では
数字 1回以上
今日の内容は以下のcheat sheetの極一部
https://evoldyn.gitlab.io/evomics-2018/ref-sheets/R_strings.pdf
今日の内容
❖ 先頭、末尾
❖ 複数選択肢
❖ 任意の値
❖ 繰り返し
❖ グループ化
❖ 前後の参照
❖ 先頭とマッチ
❖ 末尾とマッチ
先頭、末尾
正規
表現
意味
^ 文字列の先頭
$ 文字列の末尾
※この場合は「 ^ 」があってもなくても同じ
複数の選択肢とマッチ
❖ 「 ¦ 」によるOR条件
− areaから「医工」か「環境」か「情報」を抽出
− 括弧との併用で前接/後接する語の指定も可能
任意の値とマッチ
Rでの
表記
正規
表現
意味 マッチ
. . 数字や記号を含む、全ての文字(改
行を除く)
abc ABC 123 .!?¥(){}
数字を含む全ての文字 abc ABC 123 .!?¥(){}
全ての数字 abc ABC 123 .!?¥(){}
中区分90:人間医工学およびその関連分野
①
②
③
正規表現を試してみる
①
②
③
注:「+」は直前の値が1回以上続くことを示す
💡特に明記しない限り、文字列の左端からマッチする文字列
の探索が行われる
繰り返し①
正規
表現
意味 例
{n} 直前の値がn回続く = 数字5回
{n,} 直前の値がn回続く = 数字5回以上
{n,m} 直前の値がn回以上, m回 =
数字5回以上
8回未満
123456789
①
②
③
繰り返し①
①
②
③
💡文字数を範囲で指定した場合や上限がない場合、マッチす
る最長の文字列の検索が行われる
繰り返し②
正規
表現
意味 例
? 直前の値が0回か1回続く = 数字0回か1回
+ 直前の値が1回以上続く = 数字1回以上
* 直前の値が0回以上続く = 数字0回以上
中区分90:人間医工学およびその関連分野
①
②
③
繰り返し②
①
②
③
? : 0回、1回
+ : 1回以上
* : 0回以上
中区分90:人間医工学およびその関連分野
①
②
③
繰り返し②
②
💡左端からマッチする文字列の探索が行われるため、
「?」と「*」では数字0回とマッチ
? : 0回、1回
+ : 1回以上
* : 0回以上
「*」の使い所
❖ 以下の文字列全てとマッチする正規表現
信州大学
信州大学文学部
信州大学経法学部
信州大学大学院医学系研究科
共通する⽂字列 不特定の⽂字列
マッチしない
繰り返し③
❖ 最長マッチ、最短マッチ
久保 琢也 信州大学, 文学部, 助教(12345678)
💡「+」「*」はマッチする最長の文字列の探索を行う
(最長マッチ、greedy match)
.+,
何でも( . )、1回以上( + )、コンマ( , )まで
繰り返し③
❖ 最長マッチ、最短マッチ
久保 琢也 信州大学, 文学部, 助教(12345678)
💡「+?」「*?」はマッチする最短の文字列の探索を行う
(最短マッチ、non-greedy match)
.+?,
グループ化
❖ 文字列を分割して特定の部分を抽出する
久保 琢也 信州大学, 文学部, 助教(12345678)
.+, .+, .+
💡括弧内の値は順番に や で参照可能
グループ化
❖ 文字列を分割して特定の部分を抽出する
久保 琢也 信州大学, 文学部, 助教(12345678)
− 2つ目の部分を抽出する(※全体を2つ目で上書き)
− 3つ目の部分を抽出する(※全体を3つ目で上書き)
.+, .+, .+
※ str_replace( 対象, 置換前の値, 置換後の値 )
前後の参照
正規
表現
意味
(?<=a)b aが前に来るbとマッチ
(?<!a)b aが前に来ないbとマッチ
b(?=a) aが後ろにくるbとマッチ
b(?!a) aが後ろに来ないbとマッチ
前後の参照
❖ piから「教授」を抽出する
− 以下のコードでは、「教授」だけでなく、「准教授」か
らも「教授」を抽出してしまう
− 以下のコードで教授の前の1文字も含めて確認してみる
− 教授職だけを抽出するためには「准」が前に来ない「教
授」を抽出すれば良い。

R言語勉強会#7.pdf