2012-04-11 2 views

ответ

5

Вот одна идея, которая была бы легко обобщить:

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 
+1

Вы также можете использовать обратное только для одного 'nchar()' call: 'nchar (gsub (" [^ :)] "," ", text))/2' –

+0

@SachaEpskamp - К сожалению, это doesn 't делает то же самое, поскольку он заменяет все, кроме символов ':' и ')', когда вы действительно хотели заменить все, кроме * string * ':)'. Попробуйте свою идею с помощью 'text <-" A: ", чтобы понять, что я имею в виду. –

+1

С уважением. Я довольно новичок в регулярных выражениях. Я думаю, что это работает? 'nchar (gsub ("^((?!: \\)).) * "," ", текст, perl = TRUE))/2' –

1

Это делает трюк, но не может быть наиболее прямой путь:

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

EDIT

Для обработки векторов текста с длиной> 1, не unlist:

mytext<- rep("i am happy today :):)",2) 
myTextSub<-gsub(":\\)", ";:\\);", mytext) 
myTextSplit <- strsplit(myTextSub, ";") 

sapply(myTextSplit,function(x){ 
    length(grep(":)", x)) 
}) 

Но мне нравятся другие ответы лучше.

3

Я предполагаю, что вы хотите, только счет, или вы также хотите удалить :) из строки?

Для подсчета вы можете сделать:

length(gregexpr(":)",text)[[1]]) 

который дает 2. Более обобщенное решение для вектора струн:

sapply(gregexpr(":)",text),length) 

Edit:

Джош О'Брайен указал, что это также возвращает 1 из :), так как gregexpr возвращает -1 в этом случае. Чтобы исправить это, вы можете использовать:

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

Которая становится немного менее красивой.

+0

Это отличная идея, но для этого требуется немного больше работы, поскольку она терпит неудачу для строк, которые не содержат никаких '' :) "' строк вообще. (Например, попробуйте свои функции с помощью 'text <-" ABC "', чтобы убедиться, что они оба утверждают, что он содержит 1 смайлик.) Это потому, что 'gregexpr()' возвращает '-1' для такой строки , который имеет длину 1. Я действительно думаю, что фиксированная версия вашего подхода была бы более чистым решением, чем тот, который я предложил ... –

+0

Отредактировано, спасибо. –

+0

Прохладный. Я напишу это как хороший пример проблемы, в которой «gregexpr()» превосходит. –

Смежные вопросы