見出し画像

R言語:stringrパッケージを使った文字列処理


Detect Matches

str_detect:マッチした文字列の有無(論理値)

#指定した文字列を含むかどうか(パターンマッチするかどうか)を論理値(TRUEかFALSE)で判定します

test_det1 <- c("北海道", "岩手県", "東京都", "京都", "鹿児島県")
str_detect(test_det1, pattern="(都|府)")
[1] FALSE FALSE  TRUE  TRUE FALSE 

str_starts/str_ends:始まり/終わりの文字の有無(論理値)

#指定した文字から始まる文字列を含むかどうか(パターンマッチするかどうか)を論理値(TRUEかFALSE)で判定します

test_sten <- c("北海道", "岩手県", "東京都", "京都", "鹿児島県")
str_starts(test_sten, pattern="(北|東)")
[1]  TRUE FALSE  TRUE FALSE FALSE
str_ends(test_sten, pattern="(県|都)")
[1] FALSE  TRUE  TRUE  TRUE  TRUE

#「negate = TRUE」オプションを使うと、逆に指定した文字む文字列を「FALSE」として返します

str_starts(test_sten, pattern="(北|東)", negate = TRUE)
[1] FALSE  TRUE FALSE  TRUE  TRUE
str_ends(test_sten, pattern="(県|都)", negate = TRUE)
[1]  TRUE FALSE FALSE FALSE FALSE

Subset Strings

str_sub : 文字列を抽出

#「str_sub」は位置を数字で指定して文字を抽出できます

#抽出

test_su1 <- c("sringr", "文字列処理")
str_sub(test_su1, start = 2, end = 4) #先頭から2−4文字
[1] "rin"    "字列処"
str_sub(test_su1, start = -4, end = -2) #後ろから4−2文字
[1] "ing"    "字列処"

#変換への応用
#例えば文字列の先頭に余計な文字(下の例では",")が入っていた場合その文字を変換可能です
#先頭1文字をブランクに変換した例です

test_su2 <- c(",sringr", ",文字列処理")
#上の2つの文字列の先頭(start=end=1)をそれぞれ「""」に置き換えます
str_sub(test_su2, start = 1, end = 1) <- c("", "") 
test_su2
[1] "rin"    "字列処"

str_subset:パターンマッチ

#指定した文字列を含むかどうか(パターンマッチするかどうか)を判定します

test_st1 <- c("北海道", "岩手県", "東京都", "京都", "鹿児島県")
str_subset(test_st1, pattern="(都|府)")
[1] "東京都" "京都"  

#正規表現を使用することも可能です。
#先頭に「京」がある文字列を指定した例です

str_subset(test_st1, pattern="^京")
[1] "京都"

str_extract:パターンマッチした文字列の抽出(先頭一致)

#パターンマッチした(先頭の)文字列のみ抽出します

test_ext1 <- c("北海道", "岩手県", "東京都", "京都", "鹿児島県")
str_extract(test_ext1, pattern="県")
[1] NA   "県" NA   NA   "県"
str_extract(test_ext1, pattern="(県|道)")
[1] "道" "県" NA   NA   "県"

str_extract_all:パターンマッチした全ての文字列の抽出

#パターンマッチした全文字列を抽出します
#リスト型で返します

test_ext2 <- c("hokkaido", "iwate", "toukyou", "kyouto", "kagoshima")
str_extract_all(test_ext2, pattern="o")
[1] "道" "県" NA   NA   "県"
[[1]]
[1] "o" "o"

[[2]]
character(0)

[[3]]
[1] "o" "o"

[[4]]
[1] "o" "o"

#デフォルトではリスト型で返します。以下で確認しています

str_extract_all(test_ext2, pattern="o") %>% class()

[1] "list"
#「simplify=TRUE」を使うことで行列(matrix)型の出力に変更できます

str_extract_all(test_ext2, pattern="o" ,simplify=TRUE)
[,1] [,2]
[1,] "o"  "o" 
[2,] ""   ""  
[3,] "o"  "o" 
[4,] "o"  "o" 
[5,] "o"  ""

str_extract_all(test_ext2, pattern="o" ,simplify=TRUE) %>% class()
[1] "matrix" "array" 

Manage Length

str_length : 文字列長

#「str_length」は文字列の長さを返す関数です

library(stringr)

test_le1 <- "sringr"
test_le2 <- "sringr文字列処理"
str_length(c(test_le1, test_le2))
[1]  6 11

test_le3 <- c("北海道", "岩手県", "東京都", "京都", "鹿児島県")
str_length(test_le3)
[1] 3 3 3 2 4

str_trunc:指定した文字数以外を省略

#対象の文字列を置換して善太の長さを合わせる
#以下の場合、文字列の右側、左側、中央を省「...」に置換し、かつ長さを30文字に合わせる。アルファベットに使用できます

test_tru <- "There are Apples,Oranges and Bananas."

str_trunc(test_tru, 30, "right")
[1] "There are Apples,Oranges an..."
str_trunc(test_tru, 30, "left")
[1] "...Apples,Oranges and Bananas."
str_trunc(test_tru, 30, "center")
[1] "There are Appl... and Bananas."

str_trim、str_squish : 空白除去

#「str_ltrim」は文字列の前後にある空白を除去する関数です
#「str_squish」は連続する空白文字を1つにまとめます

test_tr1 <- " sringr "
str_trim(test_tr1, "both")
str_trim(test_tr1, "right")
str_trim(test_tr1, "left")
[1] "sringr"
[1] " sringr"
[1] "sringr "

test_tr2 <- "   今日は4   月10日の  日曜日  。   "
str_trim(test_tr2)
[1] "今日は4   月10日の  日曜日  。"
str_squish(test_tr2)
[1] "今日は4 月10日の 日曜日 。"

Mutate Strings

str_replase:マッチした文字列の置換(先頭一致)

#パターンマッチした文字列の先頭のみ置換します

test_rep1 <- c("hokkaido", "iwate", "toukyou", "kyouto", "kagoshima")
str_replace(test_rep1, pattern = "o", replacement = "*")
[1] "h*kkaido"  "iwate"     "t*ukyou"   "ky*uto"    "kag*shima"

str_replase_all:マッチした全ての文字列を置換

#パターンマッチしたすべての文字列を置換します

test_rep2<- c("hokkaido", "iwate", "toukyou", "kyouto", "kagoshima")
str_replace_all(test_rep1, pattern = "o", replacement = "*")
[1] "h*kkaid*"  "iwate"     "t*uky*u"   "ky*ut*"    "kag*shima"

#複数の文字列を置換することできます

str_replace_all(test_rep2, c("o" = "O", "k" = "K", "a" = "A"))
[1] "hOkkAidO"  "iwAte"     "tOukyOu"   "kyOutO"    "kAgOshimA"

str_to_lower/upper:小文字/大文字に変換(アルファベット)

test_to <- c("Apple", "Orange", "Banana")

str_to_lower(test_to)
[1] "apple"  "orange" "banana"

str_to_upper(test_to)
[1] "APPLE"  "ORANGE" "BANANA"

str_to_title:文字列の文頭のみを大文字に変換

#「title case」(タイトルケース)という形式に変換します

test_tit <- c("UNITED STATES", "united states", "United states")
str_to_title(test_tit)
[1] "United States" "United States" "United States"

Join and Split

str_c : 結合(連結)

#「str_c 」は文字列を結合させる関数です

test_st1 <- "sringrは"
test_st2 <- "文字列処理"
str_c(test_st1, test_st2)
[1] "sringrは文字列処理"

#「sep」という引数で文字と文字の間位入れる文字列や記号を付与します

test_st3 <- "北海道"
test_st4 <- "東京都"
test_st5 <- "沖縄県"
str_c(test_st3, test_st4, test_st5, sep=",")
[1] "北海道,東京都,沖縄県"

#複数文字列をベクトルで渡すと、それぞれの文字列に文字を結合します

test_st6 <- c("宮城", "神奈川", "福岡")
str_c(test_st6, "県")
[1] "宮城県" "神奈川県" "福岡県

#「collapse」を使えば文字列ベクトルの要素を1つに結合します

str_c(test_st6, "", collapse=" ")
[1] "宮城県 神奈川県 福岡県"
#なお、標準Rの「paste」を使っても同様の結合でがきます

test_st3 <- "北海道"
test_st4 <- "東京都"
test_st5 <- "沖縄県"
paste(test_st3, test_st4, test_st5, sep=",")
[1] "北海道,東京都,沖縄県"

str_split : 文字列を分割

#「str_split」は指定した文字で文字列を分割します。
#リスト型で出力します

test_sp1 <- c("北海道 札幌", "岩手県 盛岡", "東京都 東京")
str_split(test_sp1, pattern = " ")
[[1]]
[1] "北海道" "札幌"  

[[2]]
[1] "岩手県" "盛岡"  

[[3]]
[1] "東京都" "東京" 

str_split(test_sp1, pattern = " ") %>% class()
[1] "list" #リスト型

#「simplify=TRUE」(simplify=T)で行列(マトリクス)型で返すこともできます

str_split(test_sp1, pattern = " ", simplify=TRUE)
[,1]     [,2]  
[1,] "北海道" "札幌"
[2,] "岩手県" "盛岡"
[3,] "東京都" "東京"

str_split(test_sp1, pattern = " ", simplify=T) %>% class()
[1] "matrix" "array"  #マトリックス型

#nオプションで分割数を指定することもできます

test_sp2 <- c("北海道 札幌 市", "岩手県 盛岡 市", "東京都 千代田 区")
#区切られる場所は先頭にある「" "」が優先されます
str_split(test_sp2, pattern = " ", simplify=T, n=2)
[,1]     [,2]       
[1,] "北海道" "札幌 市"  
[2,] "岩手県" "盛岡 市"  
[3,] "東京都" "千代田 区"

str_split(test_sp2, pattern = " ", simplify=T, n=3)
     [,1]     [,2]     [,3]
[1,] "北海道" "札幌"   "市"
[2,] "岩手県" "盛岡"   "市"
[3,] "東京都" "千代田" "区"

参考

Web

CHEAT SHEET(PDF) 


いいなと思ったら応援しよう!