Greplを使用してデータフレームから特定のレコードを抽出しようとしています。
これは、ResultとNamesの2つの列の比較に基づいています。この変数はこの「WordNumber」のように作成されますが、同じWordに対して複数の数値(30を超える)があるため、たとえばWord1を取得するためにgrepl式を使用すると、Word12のように避けたい結果も得られます。
これを修正する方法についてのアイデアはありますか?
Names <- c("Word1")
colnames(Names) <- name
Results <- c("Word1", "Word11", "Word12", "Word15")
Records <- c("ThisIsTheResultIWant", "notThis", "notThis", "notThis")
Relationships <- data.frame(Results, Records)
Relationships <- subset(Relationships, grepl(paste(Names$name, collapse = "|"), Relationships$Results))
fixed = TRUE
を使用すると、結果がまったく返されないため、これは機能しません(これは奇妙です)。また、名前の部分をこのような他の番号と連結しようとしましたが、成功しませんでした。
Relationships <- subset(Relationships, grepl(paste(paste(Names$name, '3', sep = ""), collapse = "|"), Relationships$Results))
連結しているので、\ bを使用して完全一致を強制する方法がよくわかりません。
助言がありますか?
私はこれがちょうどだと思います:
Relationships[Relationships$Results==Names,]
^Word1$
を実行することになった場合は、単純なサブセットを実行しているだけです。複数の名前がある場合は、代わりに次を使用してください。
Relationships[Relationships$Results %in% Names,]
@Richardのソリューションに加えて、完全一致を強制する方法は複数あります。
「\ b」は、Wordの前後のパターンを識別するためのアンカーです。
> grepl("\\bWord1\\b",c("Word1","Word2","Word12"))
[1] TRUE FALSE FALSE
「\ <」は単語の始まりのエスケープシーケンスであり、「>」は終わりに使用されます
> grepl("\\<Word1\\>",c("Word1","Word2","Word12"))
[1] TRUE FALSE FALSE
^を使用して文字列の先頭に一致させ、$を使用して文字列の末尾に一致させます
Names <-c('^Word1$')
または、名前ベクトル全体に適用するには
Names <-paste0('^',Names,'$')