11

我有一个关键字(例如“绿色”)和一些文字(“我不喜欢他们,我是山姆!”)。

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

在这个例子中,答案是 3 - 文本没有 G 或 R,但有两个 E 和一个 N。

我的问题是,如果文本中的字符与关键字中的字符匹配,则它不能用于匹配关键字中的不同字符。

例如,如果我的关键字是'green',那么“匹配字符”的数量仍然是 3(一个 N 和两个 E),因为文本中只有两个 E,而不是 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)

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

  • '绿色','idonotlikethemsamiam',3(G,E,E)
  • '绿色','idonotlikethemsamiam',3(G,E,E)
  • “红色”、“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 回答