问题 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)

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

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

3622
2018-02-18 01:48


起源



答案:


函数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

13
2018-02-18 02:15



+1:我今天肯定学到了一些东西! - Simon
+1,确实非常光滑 - Ricardo Saporta
啊哈!我花了很多年的时间 match 和 charmatch 并没有注意到 pmatch 不允许重复(正是我想要的)。非常感谢! - mathematical.coffee
@ mathematical.coffee pmatch确实允许重复,但默认为false。 - N8TRO
是的,抱歉,我的意思是“没注意到 pmatch  有选择权 不允许重复“ - mathematical.coffee


答案:


函数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

13
2018-02-18 02:15



+1:我今天肯定学到了一些东西! - Simon
+1,确实非常光滑 - Ricardo Saporta
啊哈!我花了很多年的时间 match 和 charmatch 并没有注意到 pmatch 不允许重复(正是我想要的)。非常感谢! - mathematical.coffee
@ mathematical.coffee pmatch确实允许重复,但默认为false。 - N8TRO
是的,抱歉,我的意思是“没注意到 pmatch  有选择权 不允许重复“ - mathematical.coffee


也许您正在寻找关键字的UNIQUE组件?尝试:

keyword <- unique(strsplit('greeen','')[[1]])

-1
2018-02-18 01:53



不,我不是。我正试图找到 数 在文本中出现的关键字中的字符数,如果文本中的字符与关键字中的字符匹配,则不能用于匹配关键字中的另一个字符。我想要的输出是 数字,不是人物的矢量。 - mathematical.coffee