'R:无效使用重复运算符'

时间:2013-11-24 22:18:27

标签: regex r

我正在R中编写一个小函数,如下所示:

    tags.out <- as.character(tags.out)
    tags.out.unique <- unique(tags.out)
    z <- NROW(tags.out.unique)

    for (i in 1:10) {
       l <- length(grep(tags.out.unique[i], x = tags.out))
       tags.count <- append(x = tags.count, values = l) }

基本上我想要获取唯一字符向量(tags.out.unique)的每个元素,并在unique函数之前的向量中计算它的出现次数。

上面的代码部分正常工作,但是,当我用for (i in 1:10)替换for (i in 1:z)或甚至大于10的某个数字(例如18000)时,我收到以下错误:

Error in grep(tags.out.unique[i], x = tags.out) : invalid regular expression 'c++', reason 'Invalid use of repetition operators

如果有人能够帮助我理解这里发生的事情,我将非常感激。

非常感谢。

2 个答案:

答案 0 :(得分:7)

“c ++”中的“+”(您将grep作为模式字符串传递)具有特殊含义。但是,您希望将“+”字面解释为字符“+”,而不是

grep(pattern="c++", x="this string contains c++")

你应该做

grep(pattern="c++", x="this string contains c++", fixed=TRUE)

如果你谷歌[正则表达式特殊字符]或类似的东西,你会看到“+”,“*”和许多其他具有特殊含义。在你的情况下,你希望它们按字面解释 - 参见?grep。

答案 1 :(得分:3)

tags.out_unique的一个元素似乎是c++,它是(正如错误消息明确指出的)无效的正则表达式。

您目前编程效率低下。 R-inferno值得一读,特别注意到Growing对象通常是不好的形式 - 在某些情况下它可能效率极低。如果你要有一个统一的规则,那么“不增长对象”比“避免循环”更好。

鉴于您只是想计算每个值出现的次数,不需要循环或正则表达式

counts <- table(tags.out) 
# the unique values
names(counts)

应该给你想要的结果。