11

私はキーワード(例えば「緑」)といくつかのテキスト(「私はそれらが好きではありませんSam I Am!」)を持っています。

キーワード(「g」、「r」、「e」、「e」、「n」)の文字がテキストに(任意の順序で)いくつあるかを確認したいと思います。

この例では、答えは3です。テキストにはGまたはRはありませんが、2つのEと1つのNがあります。

私の問題は、テキスト内の文字がキーワード内の文字と一致する場合、それを使用してキーワード内の別の文字と一致させることができない場合に発生します。

たとえば、私のキーワードが「greeen」の場合、テキストには3つではなく2つのE(キーワードの3番目のEに一致する)しかないため、「一致する文字」の数は3(1つのNと2つのE)のままです。 。

これをRで書くにはどうすればよいですか?これは私の記憶の端にある何かを刻んでいるだけです-それは一般的な問題のように感じますが、言い方が異なります(置換なしのサンプリングのようなものですが、「置換なしの一致」ですか?)。

例えば

keyword <- strsplit('greeen', '')[[1]]
text <- strsplit('idonotlikethemsamiam', '')[[1]]
# how many characters in keyword have matches in text,
# with no replacement?
# Attempt 1: sum(keyword %in% text)
# PROBLEM: returns 4 (all three Es match, but only two in text)

期待される入力/出力のその他の例(キーワード、テキスト、期待される出力):

  • '緑'、'idonotlikethemsamiam'、3(G、E、E)
  • 'greeen'、'idonotlikethemsamiam'、3(G、E、E)
  • 'red'、'idonotlikethemsamiam'、2(EおよびD)
4

2 に答える 2

14

関数pmatch()はこれに最適です。ここで長さを使用するのは本能的ですが、長さにはna.rmオプションがありません。したがって、この厄介な問題を回避するために、sum(!is.na())が使用されます。

keyword <- unlist(strsplit('greeen', ''))
text <- unlist(strsplit('idonotlikethemsamiam', ''))

sum(!is.na(pmatch(keyword, text)))

# [1] 3

keyword2 <- unlist(strsplit("red", ''))
sum(!is.na(pmatch(keyword2, text)))

# [1] 2
于 2013-02-18T02:15:31.033 に答える
-1

おそらくあなたはあなたのキーワードのユニークなコンポーネントを見つけようとしていますか?試す:

keyword <- unique(strsplit('greeen','')[[1]])
于 2013-02-18T01:53:51.663 に答える