2017-07-18 11 views
3

を含む抽出語はstringr:特定の単語

dataframe <- data_frame(text = c('WAFF;WOFF;WIFF200;WIFF12', 
           'WUFF;WEFF;WIFF2;BIGWIFF')) 

> dataframe 
# A tibble: 2 x 1 
         text 
        <chr> 
1 WAFF;WOFF;WIFF200;WIFF12 
2 WUFF;WEFF;WIFF2;BIGWIFF 

この単純な例を考えてみましょうここで私はWIFFを含む単語を抽出したい、それは私がこの

> output 
# A tibble: 2 x 1 
      text 
      <chr> 
1 WIFF200;WIFF12 
2 WIFF2;BIGWIFF 
のようなデータフレームで終わるしたいです

私は使用しようとしました

dataframe %>% 
    mutate(mystring = str_extract(text, regex('\bwiff\b', ignore_case=TRUE))) 

しかし、これはNAを返すだけです。何か案は?

ありがとうございます!

答えて

2

WIFFと末尾に;が含まれているすべての単語を削除すると思われるようです。

> dataframedataframe <- data.frame(text = c('WAFF;WOFF;WIFF200;WIFF12', 'WUFF;WEFF;WIFF2;BIGWIFF')) 
> dataframe$text <- str_replace_all(dataframe$text, "(?i)\\b(?!\\w*WIFF)\\w+;?", "") 
> dataframe 
      text 
1 WIFF200;WIFF12 
2 WIFF2;BIGWIFF 

にパターン(?i)\\b(?!\\w*WIFF)\\w+;?マッチ使用: - 大文字小文字を区別しないインライン修飾子

  • \\b - ワード境界
  • (?!\\w*WIFF) -

    • (?i)を否定先読みは、単語がWIFFを含むすべての試合に失敗しましたその中のどこでも
    • \\w+ - 1つ以上の単語の文字S
    • ;? - オプション;?マッチ1またはそれが修飾パターンの0出現)

    あなたがstr_extractを使用したい何らかの理由で、あなたの正規表現が\bWIFF\b matches a whole word WIFF何もないので、動作しないことができることに注意している場合。あなたはあなたのDFにそのような言葉を持っていません。あなたはWIFF内部(小文字を区別せずにケース)に任意の単語を一致させるために"(?i)\\b\\w*WIFF\\w*\\b"を使用して複数のオカレンスを取得するためにstr_extract_allを使用し、シングル「文字列」にマッチに参加することを忘れてはいけないことがあります。

    > df <- data.frame(text = c('WAFF;WOFF;WIFF200;WIFF12', 'WUFF;WEFF;WIFF2;BIGWIFF')) 
    > res <- str_extract_all(df$text, "(?i)\\b\\w*WIFF\\w*\\b") 
    > res 
    [[1]] 
    [1] "WIFF200" "WIFF12" 
    
    [[2]] 
    [1] "WIFF2" "BIGWIFF" 
    
    > df$text <- sapply(res, function(s) paste(s, collapse=';')) 
    > df 
          text 
    1 WIFF200;WIFF12 
    2 WIFF2;BIGWIFF 
    

    あなたが「縮小」もコードはsapplyの機能にstr_extract_allを置くことでコード化しました。ベースRを経由して

  • +0

    のおかげだろう。一致するパターンを抽出するのではなく、一致しないパターンを置き換える方が簡単であることを暗示しているようです。どうして? –

    +1

    @ノービー:私はそれを言わなかった。簡単なことを決めるのはあなた次第です。 –

    +0

    あなたのソリューションは素晴らしいですが、私の 'str_extract'がまったく動作しないことは知っていますか? –

    3

    古典的な、非正規表現のアプローチは、Wiktor第は非常にいい

    sapply(strsplit(me$text, ';', fixed = TRUE), function(i) 
               paste(grep('WIFF', i, value = TRUE, fixed = TRUE), collapse = ';')) 
    
    #[1] "WIFF200;WIFF12" "WIFF2;BIGWIFF" 
    
    +1

    good ol;ベースR.ありがとう! –

    関連する問題