web-dev-qa-db-ja.com

greplRとの完全一致

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を使用して完全一致を強制する方法がよくわかりません。

助言がありますか?

5
Barbara

私はこれがちょうどだと思います:

Relationships[Relationships$Results==Names,]

^Word1$を実行することになった場合は、単純なサブセットを実行しているだけです。複数の名前がある場合は、代わりに次を使用してください。

Relationships[Relationships$Results %in% Names,]
3
thelatemail

@Richardのソリューションに加えて、完全一致を強制する方法は複数あります。

\ b

「\ b」は、Wordの前後のパターンを識別するためのアンカーです。

> grepl("\\bWord1\\b",c("Word1","Word2","Word12"))
[1]  TRUE FALSE FALSE

\ <&\>

「\ <」は単語の始まりのエスケープシーケンスであり、「>」は終わりに使用されます

> grepl("\\<Word1\\>",c("Word1","Word2","Word12"))
[1]  TRUE FALSE FALSE
6
parth

^を使用して文字列の先頭に一致させ、$を使用して文字列の末尾に一致させます

Names <-c('^Word1$')

または、名前ベクトル全体に適用するには

Names <-paste0('^',Names,'$')
2
Richard