2013-02-18 55 views
11

我有一个关键字(例如“绿色”)和一些文本(“我不喜欢他们山姆我是!”)。R - 计数一个字符串和另一个字符之间的匹配项,无替换

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

在这个例子中,答案是3 - 文本不具有A G或R,但具有两个居和N.

我的问题出现了,其中,如果在文本中的字符与字符匹配在关键字中,则不能用来匹配关键字中的不同字符。

例如,如果我的关键字是'greeen',则“匹配字符”的数目仍然是3(一个N和两个Es),因为文本中只有两个Es,而不是3(与第三个E在关键字中)。

如何在R中编写此代码?这只是在我记忆力的边缘点出了一些东西 - 我觉得这是一个普遍的问题,但措辞不同(有点像取样没有替代品,但是“没有替代品相匹配”)。

E.g.

  • '绿色', 'idonotlikethemsamiam',3(G,E,E)
  • “greeen:预期的输入/输出(关键词,文本,预期输出)

    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',2(E和d)

回答

13

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

+1:我今天肯定学到了东西! – Simon 2013-02-18 02:30:48

+2

+1,确实非常光滑 – 2013-02-18 02:44:06

+0

啊哈!我花了很多时间尝试'match'和'charmatch',并没有注意到'pmatch'不允许重复(正是我想要的)。非常感谢! – 2013-02-18 02:56:30

-1

也许你想找到独特的组成部分您的关键字?试试:

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

不,我不是。我试图在文本中发现关键字中的字符数*号,如果文本中的字符与关键字中的字符匹配,则不能用于匹配关键字中的另一个字符。我想要的输出是**数字**,而不是一个字符的矢量。 – 2013-02-18 01:54:53

相关问题