2017-12-21 24 views
2

に複数の単語の完全一致に基づいて新しい列を核変換します最初の4つの列の式を評価し、その式が完全に満たされている場合は、各列に基づいて1/0を出力します。私が下にあるコードは、完全な単語(一部のみ)と一致せず、間違ったデータを提供します(下記の結果を参照)。は、私は、データフレームを持つ文字列

df %>% 
    rowwise() %>% 
    transmute_at(vars(NP, OM, RSS, suck), 
       funs(case_when(
       grepl(., Dominantspp) ~ "1", 
       grepl(., Commonspp) ~ "1", 
       grepl(., Rarespp) ~ "1", 
       grepl(., Otherspp) ~ "1", 
       TRUE ~ "0"))) %>% 
    ungroup() 

結果:3行目の「suck」と「RSS」の両方が「1」を受け取ることを確認してください。

# A tibble: 4 x 4 
    NP OM RSS suck 
    <chr> <chr> <chr> <chr> 
1  0  1  0  1 
2  0  1  0  0 
3  0  0  1  1 
4  1  1  1  1 

所望の出力:

NP OM RSS suck 
1 0 1 0 1 
2 0 1 0 0 
3 0 0 1 0 
4 1 1 1 0 
+0

上記のテストケースに対して期待される正しい結果を提供できますか? –

+0

明らかにするために、4つのうちのいずれか*(Otherspp、Dominantsppなど)がその正規表現と一致するとき、対応する列に0または1を入れたいですか? –

+0

投稿を希望の出力(@StuartAllen)で更新しました。私はその種の「存在」を表すために1を、不在の場合は0を(@David Robinson)欲しい。 – LAB

答えて

2

あなたと同じアプローチを使用して、あなたの問題を解決するための最速の方法は\\bで、あなたの正規表現のそれぞれの最初と最後に単語の境界を追加することです:

df <- data.frame(
    Otherspp = c("suck SD", "BT", "SD RS", "RSS"), 
    Dominantspp = c("OM", "OM", "RSS", "CH"), 
    Commonspp = c(" ", " ", " ", "OM"), 
    Rarespp = c(" ", " ", "SD", "NP"), 
    NP = rep("\\b(northern pikeminnow|NORTHERN PIKEMINNOW|np|NP|npm|NPM)\\b", 4), 
    OM = rep("\\b(steelhead|STEELHEAD|rainbow trout|RAINBOW TROUT|st|ST|rb|RB|om|OM\\b)", 4), 
    RSS = rep("\\b(redside shiner|REDSIDE SHINER|rs|RS|rss|RSS)\\b", 4), 
    suck = rep("\\b(suckers|SUCKERS|sucker|SUCKER|suck|SUCK|su|SU|ss|SS)\\b", 4), 
    stringsAsFactors = FALSE 
) 

これにより、正規表現は完全な単語にしか一致しません。これにより、後続のソリューションが動作します。


私は、これは必ずしも(rowwise()めったに今日推奨されていないが、このアプローチは、多くの魚コードにうまくスケールしません)問題にアプローチするための方法だとは思わない、と述べました。私はあなたがきちんとフォーマットに標準化した場合、あなたが行とコードの組み合わせごとに1行で、このデータを扱う簡単に時間を持っていると思う:

library(tidyr) 
library(tidytext) 

row_codes <- df %>% 
    select(Otherspp:Rarespp) %>% 
    mutate(row = row_number()) %>% 
    gather(type, codes, -row) %>% 
    unnest_tokens(code, codes, token = "regex", pattern = " ") 

につながることになる。

row  type code 
1 1 Dominantspp om 
2 1 Otherspp suck 
3 1 Otherspp sd 
4 2 Dominantspp om 
5 2 Otherspp bt 
6 3 Dominantspp rss 
7 3 Otherspp sd 
8 3 Otherspp rs 
9 3  Rarespp sd 
10 4 Commonspp om 
11 4 Dominantspp ch 
12 4 Otherspp rss 
13 4  Rarespp np 

この時点で、コードは扱いがずっと簡単です(正規表現はもう必要ありません)。たとえば、inner_joinを魚コードの表に追加できます。

+0

私はこのアプローチを打ち、大きなデータセットではうまくいくかどうかを見ていきます。 – LAB

関連する問題