使用R从向量中提取指定字

使用R从向量中提取指定字,r,R,我有一篇课文 text<- "i am happy today :):)" text这是一个技巧,但可能不是最直接的方法: mytext<- "i am happy today :):)" # The following line inserts semicolons to split on myTextSub<-gsub(":)", ";:);", mytext) # Then split and unlist myTextSplit <- unlist(strs

我有一篇课文

text<- "i am happy today :):)"

text这是一个技巧,但可能不是最直接的方法:

mytext<- "i am happy today :):)"

# The following line inserts semicolons to split on
myTextSub<-gsub(":)", ";:);", mytext)

# Then split and unlist
myTextSplit <- unlist(strsplit(myTextSub, ";"))

# Then see how many times the smiley turns up
length(grep(":)", myTextSplit))

mytext这里有一个想法,很容易概括:

text<- c("i was happy yesterday :):)",
         "i am happy today :)",
         "will i be happy tomorrow?")

(nchar(text) - nchar(gsub(":)", "", text))) / 2
# [1] 2 1 0

text我假设您只需要计数,还是还要从字符串中删除
:)

对于计数,您可以执行以下操作:

length(gregexpr(":)",text)[[1]])
这等于2。字符串向量的更普遍的解决方案是:

sapply(gregexpr(":)",text),length)
编辑: Josh O'Brien指出,在这种情况下,
gregexpr
返回
-1
,因此这也返回了其中的1个。要解决此问题,您可以使用:

sapply(gregexpr(":)",text),function(x)sum(x>0))

它确实变得不那么漂亮了。

你也可以对一个
nchar()
调用使用相反的方法:
nchar(gsub(“[^:)]”,“”,text))/2
@SachaEpskamp——不幸的是,这并不能做完全相同的事情,因为它会替换除字符
)之外的所有字符,当您确实想要替换除字符串以外的所有内容时:)
。用
文本试试你的想法,谢谢。我对正则表达式相当陌生。我觉得这样行吗
nchar(gsub(“^((?!:\\))*”,“”,text,perl=TRUE))/2
在我看来很不错,尽管我在理解一些细节方面有点困难,比如为什么需要
“^”
,为什么
文本中的所有
都没有匹配和删除。这是一个很好的主意,但是它需要做更多的工作,因为对于不包含任何
“:)”
字符串的字符串,它会失败。(使用
text Cool试用你的函数。我将把它作为
gregexpr()
擅长的问题的一个很好的例子存档。
sapply(gregexpr(":)",text),function(x)sum(x>0))