R - 计数匹配一个字符串和另一个字符串之间的字符,没有替换

mat*_*fee 11 r

我有一个关键字(例如'绿色')和一些文字("我不喜欢他们Sam我是!").

我想看看关键字中有多少个字符('g','r','e','e','n')出现在文本中(按任意顺序).

在这个例子中答案是3 - 文本没有G或R但有两个Es和N.

我的问题出现在如果文本中的字符与关键字中的字符匹配,那么它不能用于匹配关键字中的不同字符.

例如,如果我的关键字是'greeen',则"匹配字符"的数量仍为3(一个N和两个Es),因为文本中只有两个Es,而不是3(以匹配关键字中的第三个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)
Run Code Online (Sandbox Code Playgroud)

预期输入/输出的更多示例(关键字,文本,预期输出):

  • 'green','idonotlikethemsamiam',3(G,E,E)
  • 'greeen','idonotlikethemsamiam',3(G,E,E)
  • 'red','idonotlikethemsamiam',2(E和D)

N8T*_*TRO 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
Run Code Online (Sandbox Code Playgroud)

  • +1:我今天肯定学到了一些东西! (2认同)