Вы можете выполнить этот анализ с помощью пакета stringr
, однако я не думаю, что вам нужно использовать sapply
.
Рассмотрим следующий список ключевых слов и таблицу с твитами:
keyword_list <- c("crimes against women", "downloading tweets", "r analysis")
tweets <- data.frame(
tweet = c("Andhra Pradesh is the highest state with crimes against women",
"I am downloading tweets",
"I love r analysis",
"downloading tweets helps with my r analysis")
)
Во-первых, вы хотите объединить ваши ключевые слова в одно регулярное выражение, которое ищет любую из строк.
keyword_pattern <- paste0(
"(",
paste0(keyword_list, collapse = "|"),
")"
)
keyword_pattern
#> [1] "(crimes against women|downloading tweets|r analysis)"
Наконец, мы можем добавить столбец к фрейму данных, который извлекает ключевое слово из твита.
tweets$keyword <- str_extract(tweets$tweet, keyword_pattern)
> tweets
#> tweet keyword
#> 1 Andhra Pradesh is the highest state with crimes against women crimes against women
#> 2 I am downloading tweets downloading tweets
#> 3 I love r analysis r analysis
#> 4 downloading tweets helps with my r analysis downloading tweets
Как показывает последний пример, вам нужно подумать о том, что вы хотите делать, когда твит содержит несколько ключевых слов. В этом случае возвращаемое ключевое слово - просто первое найденное в твите. Однако вы также можете использовать str_extract_all
для возврата ВСЕХ ключевых слов, найденных в твите.
+ оператор оценивает и форму налево и форму направо от нее, затем возвращает сумму обоих. Оценка вызова хеша не видит специального контекста.
++ оператор имеет некоторое специальное встроенное волшебство. Заключение в кавычки из perlop страницы справочника, относительно ++ оператор:
"undef" всегда рассматривают как числовой, и в особенности изменяют на 0 прежде, чем увеличить (так, чтобы постинкремент значения undef возвратился 0, а не "undef").
править: Уточнить различие, ++ изменяет значение на месте, в то время как + просто берет его аргументы в качестве входа. Когда + видит неопределенное значение, обычно что-то пошло не так, как надо, но для ++, Ваш пример управления хешем очень типичен - пользователь хочет рассматривать undef как 0, вместо того, чтобы иметь необходимость проверить и инициализировать каждый раз. Таким образом, кажется, что имеет смысл рассматривать эти операторы этот путь.
It не, что Perl обязательно инициализирует значения, но что он не всегда предупреждает о них. Не пытайтесь думать о правиле для этого, потому что Вы будете всегда находить исключения, и как раз в то самое время, когда Вы думаете, что Вам выяснили его, следующая версия Perl изменит предупреждения на Вас.
В этом случае, как Harleqin заявил, автоинкрементные операторы имеют особый случай.
Определенные операторы сознательно опускают "неинициализированное" предупреждение для Вашего удобства, потому что они являются наиболее часто используемыми в ситуациях, где 0 или "" значение по умолчанию для левых или только операнда имеют смысл.
Это: ++ и - (или пред или сообщение), + =, - =. =, | =, ^ =, && =, || =.
Обратите внимание, что некоторые из них ошибочно дают предупреждение при использовании на связанной переменной: посмотрите, что тесты отметили TODO в http://perl5.git.perl.org/perl.git/blob/HEAD:/t/op/assignwarn.t.
Поскольку Brian упомянул: это все еще делает это, это просто предупреждает Вас. Предупреждения говорят Вам об определенных манипуляциях с эффектами, что Вы, возможно, не предназначили.
Вы конкретно просите значение $histogram{$_}
, добавление 1 к нему и затем присвоение его к тому же слоту. Это - тот же способ, которым я не ожидал бы, что autovivification будет работать здесь:
my $hash_ref = $hash_for{$key_level_1};
$hash_ref->{$key_level_2} = $value;
поскольку это делает здесь:
$hash_for{$key_level_1}{$key_level_2} = $value;
Волшебство, вероятно, не работает как оптимизация. И оптимизирующий компилятор заметил бы это a = a + 1
то же самое как a++
так, чтобы был там инкрементный оператор в ассемблере, он мог использовать, который оптимизировал инструкцию вместо того, чтобы притвориться, что он должен был сохранить первое значение и затем перезапись его, потому что он не на самом деле необходим.
Оптимизация является дополнительным исследованием и наверху однажды для улучшенной производительности каждое выполнение. Но нет никакой гарантии на динамическом языке, что Вы не добавляете наверху на том же уровне, Вы иначе попытались бы уменьшить его.