Как я могу обойти NA при использовании stringr :: word для обработки нескольких строк в цикле? - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь извлечь первое, второе, третье и т. Д. Слово из конца строки.stringr: word () может сделать это, указав строку и позицию, которую вы хотите (используя символ «минус», чтобы указать счетчик с конца строки).Я пытаюсь сделать это из потенциально длинного списка строк переменной длины (т.е. не знаю длину строки).Когда stringr::word находит NA (строка, длина которой меньше длины, которую я хочу извлечь), она останавливает цикл while и отправляет сообщение об ошибке.Как я могу игнорировать это, чтобы перейти к следующей строке?

Вот пример: word("yum just made fresh", -5)

Вывод: [1] NA Предупреждающие сообщения: 1: In stri_sub (строка, от = начало, до = конец): аргумент не является атомным вектором;принуждение 2: в stri_sub (строка, от = начало, до = конец): аргумент не является атомным вектором;coercing

И по какой-то причине этот код:

word("ifkoalasshadarealityshow cake", -5)

даст это

output: [1] "ifkoalasshadarealityshow"

, даже если разделителем по умолчанию является пробел.

Вот мой цикл по мере увеличения счетчика:

Подмножество данных

x <- c("would be really into in", "demands the return of the", "", "tomato sugar free lemonada is", "thoughts of eating a piece of", "ifkolalashadarealityshow cake", "yum just made fresh", "ever had a")

Извлечение последнего слова (не проблема)

word(x, -1) 
#[1] "in"    "the"   ""      "is"    "of"    "cake"  "fresh" "a"

Извлечение второго до последнего слова (предупреждение, но можно использовать вывод)

word(x, -2)

[1] "into"                     "of"                       NA                         "lemonada"                 "piece"                   
[6] "ifkolalashadarealityshow" "made"                     "had

"

Предупреждающие сообщения: 1: в stri_sub (строка, от = начало, до = конец):аргумент не является атомарным вектором; приведение 2: в stri_sub (строка, от = начало, до = конец): аргумент не атомарный вектор; приведение

аналогично третьему и четвертому последним словам(предупреждение, но пригодный для использования вывод)

word(x, -3)

[1] "really" "return" NA       "free"   "a"      NA       "just"   "ever" 

Предупреждающие сообщения: 1: в stri_sub (строка, от = начало, до = конец): аргумент не является атомарным вектором;(string, from = start, to = end): аргумент не является атомарным вектором; принудительное

 word(x, -4)
[1] "be"     "the"    ""       "sugar"  "eating" "cake"   "yum"    NA     

Предупреждающее сообщениеs: 1: в stri_sub (string, from = start, to = end): аргумент не является атомным вектором;принуждение 2: в stri_sub (строка, от = начало, до = конец): аргумент не является атомным вектором;принуждение

Пятый до последнего останавливает цикл (ошибка и останавливает цикл)

 word(x, -5)

Ошибка в stri_sub (строка, от = начало, до = конец): (список) объект не может быть приведен к типу 'integer'. Дополнительно: Предупреждающее сообщение: In stri_sub (string, from = start, to = end): аргумент не является атомарным вектором;принуждение

На пятой итерации цикл останавливается.Я хотел бы обойти любые ошибки, чтобы продолжить обработку всех данных.

Спасибо за чтение и любые советы.

1 Ответ

0 голосов
/ 20 января 2019

Вы можете использовать str_count для подсчета количества пробелов, а затем использовать его для выбора только элементов x с> = 5 словами

library(stringr)

word(x[str_count(x, ' ') + 1 >= 5], -5)

#[1] "would"   "demands" "tomato"  "of" 

Или, если вы хотите сохранить NA s

good <- str_count(x, ' ') + 1 >= 5
replace(rep(NA, length(x)), which(good), word(x[good], -5))

[1] "would"   "demands" NA        "tomato"  "of"      NA        NA        NA

или

library(tidyverse)

map_chr(x, ~ if(str_count(.x, ' ') + 1 >= 5) word(.x, -5) else NA)

[1] "would"   "demands" NA        "tomato"  "of"      NA        NA        NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...