我正在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
如果有人能够帮助我理解这里发生的事情,我将非常感激。
非常感谢。
答案 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)
应该给你想要的结果。