У меня есть текст, напримерРаспаковка заданное слово из вектора с помощью R
text<- "i am happy today :):)"
Я хочу, чтобы извлечь :) из текстового вектора и сообщить его частота
У меня есть текст, напримерРаспаковка заданное слово из вектора с помощью R
text<- "i am happy today :):)"
Я хочу, чтобы извлечь :) из текстового вектора и сообщить его частота
Вот одна идея, которая была бы легко обобщить:
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
Это делает трюк, но не может быть наиболее прямой путь:
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))
})
Но мне нравятся другие ответы лучше.
Я предполагаю, что вы хотите, только счет, или вы также хотите удалить :)
из строки?
Для подсчета вы можете сделать:
length(gregexpr(":)",text)[[1]])
который дает 2. Более обобщенное решение для вектора струн:
sapply(gregexpr(":)",text),length)
Джош О'Брайен указал, что это также возвращает 1 из :)
, так как gregexpr
возвращает -1
в этом случае. Чтобы исправить это, вы можете использовать:
sapply(gregexpr(":)",text),function(x)sum(x>0))
Которая становится немного менее красивой.
Это отличная идея, но для этого требуется немного больше работы, поскольку она терпит неудачу для строк, которые не содержат никаких '' :) "' строк вообще. (Например, попробуйте свои функции с помощью 'text <-" ABC "', чтобы убедиться, что они оба утверждают, что он содержит 1 смайлик.) Это потому, что 'gregexpr()' возвращает '-1' для такой строки , который имеет длину 1. Я действительно думаю, что фиксированная версия вашего подхода была бы более чистым решением, чем тот, который я предложил ... –
Отредактировано, спасибо. –
Прохладный. Я напишу это как хороший пример проблемы, в которой «gregexpr()» превосходит. –
Вы также можете использовать обратное только для одного 'nchar()' call: 'nchar (gsub (" [^ :)] "," ", text))/2' –
@SachaEpskamp - К сожалению, это doesn 't делает то же самое, поскольку он заменяет все, кроме символов ':' и ')', когда вы действительно хотели заменить все, кроме * string * ':)'. Попробуйте свою идею с помощью 'text <-" A: ", чтобы понять, что я имею в виду. –
С уважением. Я довольно новичок в регулярных выражениях. Я думаю, что это работает? 'nchar (gsub ("^((?!: \\)).) * "," ", текст, perl = TRUE))/2' –