R言語による医療データ分析

R言語によるデータ分析のオンラインコースを中心に、さまざまなデータ分析について記載してあります。

081-085 正規表現

まとめ一覧

正規表現

  • さあ、filterへ!といきたいところでえすが、もう一山、Booleanが「しるし」になることを理解したあと、文字列に「しるし」をつける方法を学びましょう。
  • 正規表現というものですが、これは、多分、このコースでもかなりとっつきにくい部類に入ります。
  • たとえば、次の文字列から、数字だけを抜き出したい場合にどのような方法がとれるでしょう?
vec <- c("HbA1c:9.2%","ALT:120UI","WBC:9.3x10^3")
  • いままでにお伝えしたものでは無理です。
  • ここから、このような、文字配列的に汚いデータから欲しいデータを抜き出す方法、正規表現を学びましょう。
#ちなみに、上記の問題は、
library(stringr)
str_extract(vec, "(?<=:)(\\d+\\.\\d+)|(?<=:)\\d+")
  • で達成できます。

正規表現とは

  • 正規表現は文字列をパターンでひっかける手法です。

  • 注:

    • 正規表現を完全にマスターすることは、本コースの目的ではありません。
    • よくある問題を解決するための最低限をお伝えすることを目的としています。
    • 正規表現を利用しないで解決できる問題は可能な限りそっちを利用することが良いかもしれません。
vec <- c("1","120","34.3","ab123", 
         "5b","6 5","7","b","ac4235432",
         "45.3mg/dl","abc500ml 3unit 3:40AM",
         "^ is start.",
         "this sign($) represents end.", "....")

vec
  • たとえば、"1"という文字が含まれているかどうかを調べたければ、str_detect()を使います。
str_detect(vec,"1")

#[]をつかって抜き出してみましょう。
vec[str_detect(vec,"1")]

#尚、複数の文字列をひっかけたい場合は、"[1234]"のように書きます。
check <- str_detect(vec,"[1234]")
vec[check]

正規表現を色々確認してみる

  • 何が引っ掛かったかみたい場合は、str_view()を使うとわかりやすいです。
str_view(vec,"[1234]")

str_view(vec,"[1234567890]")
str_view(vec,"[0-9]")

#二文字引っ掛かったかは、
str_view(vec,"[0-9][0-9]")
str_view(vec,"[0-9]{1,}")

#数字が連続した場合を調べるには
str_view(vec,"[0-9]+")

#x回数以上y回数以下を調べるには
str_view(vec,"[0-9]{3,4}")

#[0-9] と \\dは同じ意味です。
str_view(vec,"\\d+")

#「なんでもよい」場合は.で表現できます。
str_view(vec,".")
str_view(vec,".+")

#パターンの開始が文字列の先頭にあるかを^で調べることもきます。
str_view(vec,"^b")

#同様に最後は$です。
str_view(vec,"\\d{3}$")

#^と$
str_view(vec,"^b$")
str_view(vec,"^\\d+$")

#ところで、.とか^とか$とかを

str_view(vec,"^")

#ひっかけるにはどうしたらいいでしょうか?\\でエスケープ

str_view(vec,"\\^")
str_view(vec,"\\$")
str_view(vec,"\\.+")

正規表現で小数点がある数字だけ抜き出してみる

  • ここまでの知識で、最初の少数点のみ抜き出すということが実現できます。
  • 143.23 は、 \\d+\\.\\d+で拾えるので、
str_view(vec,"\\d+\\.\\d")
  • でも、これだと少数点がついていないケースはだめですね
  • \\d+のみのパターンに対しては|をつかいます。
  • \\d+\\.\\d+ | \\d+
str_view(vec,"\\d+\\.\\d+ | \\d+") #これだとうまくいきません
  • 「 」スペースも文字なので、
str_view(vec," ")

str_view(vec,"\\d+\\.\\d+|\\d+")
str_view(vec,"(\\d+\\.\\d+)|(\\d+)")

str_view(vec,"a(b|c)")
str_view(vec,"(ab)|(c)")

正規表現の練習

  • 次のような文字列から、欲しい数字を抜き出すにはどうしますか?
exa <-"room200 3unit AM3:40 abc300ml"
  • "abc300ml"が何らかの点滴の名前だとして、300mlの300を抜き出したいとすると、
str_view(exa,"\\d+") #X
  • 条件をつけます!
  • パターンA(?=パターンB)で、「パターンAパターンB」がひっかかる部分のパターンAを抜き出す。という操作ができます
str_view(exa,"\\d+(?=ml)")
  • (?<=パターンA)パターンBだと<の開いている方向に
  • (?=)と同様のことができます。
str_view(exa,"(?<=room)\\d+")
str_view(exa,"(?<=abc)\\d+")

str_view(exa,"\\d+(?=ml)")
str_view(exa,"\\d+(?=unit)")

#その他

str_view(vec,"\\w+") #すべての文字
str_view(vec,"\\W+") #すべての非文字

str_view(vec,"\\d+") #すべての数字
str_view(vec,"\\D+") #すべての非数字

str_view(vec,"\\s+") #スペース
str_view(vec,"\\S+") #非スペース
  • もっと深く知りたいという方はstringrのチートシートをRstudioのサイトからダウンロードしてみてください。

まとめ一覧