!! 文字列の有無を検索する '''str_detect(string, pattern)'''は 変数stringに該当するpattern文字列が入っているかどうかを調べる関数。TRUE/FALSEが返される。 通常、patternの部分は一単語だが、複数入れたり条件式にしたい場合がある。 ! 単純な例:patternに検索したい言葉をあてる > str_detect("今日はよいお天気です", "晴れ") [1] FALSE > str_detect("今日はよいお天気です", "天気") [1] TRUE ! 複数の言葉で条件を入れたい時::AND条件 OR条件を使い分ける > str_detect("明日は晴れか曇りかわかりません", "晴れ, 雨") #AND条件はカンマで区切る=NG [1] FALSE > str_detect("明日は晴れか曇りかわかりません", "晴れ, 曇り") #AND条件はカンマで区切る=NG [1] FALSE > str_detect("明日は晴れか曇りかわかりません", "(?=.*晴れ)(?=.*曇り)") #AND条件はやや難しい [1] TRUE > str_detect("明日は晴れか曇りかわかりません", "晴れ|曇り") #OR条件はパイプでつなぐ [1] TRUE > str_detect("明日は晴れか曇りかわかりません", c("晴れ","曇り")) #どちらの条件が該当するかがわかる [1] TRUE TRUE ! 始まりの文字列で指定したいときは、str_starts()を使う > pat = "(REV|Rev|ACC|acc)" > str_starts(c(" REV", "rev", "Rev/", "REV/ACC"), pattern = regex(pat, ignore_case = T)) [1] FALSE TRUE TRUE TRUE > str_starts(str_trim(c(" REV", "rev", "Rev/", "REV/ACC")), pattern = regex(pat, ignore_case = T)) #開始の空白を取り除く [1] TRUE TRUE TRUE TRUE > pat = "rev|acc" > str_starts(str_trim(c(" REV", "rev", "Rev/", "REV/ACC")), pattern = regex(pat, ignore_case = T)) [1] TRUE TRUE TRUE TRUE !検索パターンをはじめから正規表現で定義しておくこともできる > pat = regex(pat, ignore_case=T) #検索パターンをはじめから正規表現で定義しておくこともできる > pat [1] "rev|acc" attr(,"options") attr(,"options")$case_insensitive [1] TRUE attr(,"options")$comments [1] FALSE attr(,"options")$dotall [1] FALSE attr(,"options")$multiline [1] FALSE attr(,"class") [1] "stringr_regex" "stringr_pattern" "character" > str_starts(str_trim(c(" REV", "rev", "Rev/", "REV/ACC")), pattern = pat) [1] TRUE TRUE TRUE TRUE ! さらに複雑なパターン::正規表現を使う > string = c("金が増えた", "金が減った", "腹が減った", "金メダルが増えた", "金メダイが食いたい") > str_detect(string, pattern = "金.*(増|減)") [1] TRUE TRUE FALSE TRUE FALSE > str_detect(string, pattern = "金メ.*(増|減)") [1] FALSE FALSE FALSE TRUE FALSE > str_detect(string, pattern = "金が.*(増|減)") [1] TRUE TRUE FALSE FALSE FALSE :以下は松澤教授による: > string = c("金が増えた", "カネを増やす", "金が減った", "腹が減った", "金メダルが増えた", "金メダイが食いたい") > w1 = c("金", "カネ") > w2 = c("増", "減") > pattern1 = paste0("(", paste0(w1, collapse = '|'), ".*", paste0(w2, collapse = '|'),")") > str_detect(string, pattern1) [1] TRUE TRUE TRUE TRUE TRUE TRUE > w1 = c("が", "金") > pattern1 = paste0("(", paste0(w1, collapse = '|'),")", ".*", "(", paste0(w2, collapse = '|'),")") > pattern1 [1] "(が|金).*(増|減)" > str_detect(string, pattern1) [1] TRUE FALSE TRUE TRUE TRUE FALSE 「.*」は任意の文字数列を表現する :ベテランからのアドバイス: 凝った正規表現はロジックの可読性が悪いので、複数に分けてcodingしたほうがよい。