Функция в R, которая возвращает первое слово в предложении, длина которого является четным числом, а также длинным четным словом - PullRequest
0 голосов
/ 21 декабря 2018

Эта функция должна возвращать самое длинное четное слово (строка), которое является первым вхождением строки с максимальной длиной четного числа. Если четной длины нет, она должна возвращать 00.

Ограничения - строка предложениясостоят из пробелов и диапазон предложений составляет от 1 до 10 ^ 5.

Для бывшего предложения 1 - «Время и прилив не ждут ни одного». Здесь четные символы - это время и прилив и ни один из них с 4 буквами.Но время наступает первым, поэтому время должно отображаться.Предложение 2 - «Тит за тат». В этом предложении нет, поэтому оно должно возвращать 00. Предложение 3 - «Глаза - это зеркало мыслей человека», мысли - самое большое четное слово среди четных слов глаза, зеркало.

1 Ответ

0 голосов
/ 21 декабря 2018

Вы можете сделать это с помощью популярных библиотек stringr и dplyr.

library(dplyr)
library(stringr)

df <- tibble(
  sentence = c(
    "Time & tide waits for none",
    " Tit for tat",
    "Eyes are mirror of person's thoughts",
    "Some Other Sentence",
    "Odd sentences failure"
  )
)

df <- df %>%
  # Split the sentence and store it in a new column
  mutate(split_sentence = str_split(sentence," ")) %>%
  # Do the next step row wise because we will be dealing with a vector of vectors
  rowwise() %>%
  # Keep only words that have a remainder of 0 when divided by 2 (str_length modulo 2)
  mutate(split_sentence = list(split_sentence[str_length(split_sentence) %% 2 == 0])) %>%
  # Only keep non-null strings !""
  mutate(split_sentence = list(split_sentence[str_length(split_sentence) > 0])) %>%
  # Find the first word with the longest length
  mutate(split_sentence = list(split_sentence[which.max(str_length(split_sentence))])) %>%
  # Keep only the first word left in the vector or return NA if none left
  mutate(first_even = first(split_sentence)) %>%
  # Ungroup because we don't need to work rowwise anymore
  ungroup() %>%
  # Convert any NA values to "00" per question
  mutate(first_even = ifelse(is.na(first_even),"00",first_even)) %>%
  select(-split_sentence)

# A tibble: 5 x 2
#   sentence                             first_even
#   <chr>                                <chr>     
# 1 Time & tide waits for none           Time      
# 2 " Tit for tat"                       00        
# 3 Eyes are mirror of person's thoughts person's  
# 4 Some Other Sentence                  Sentence  
# 5 Odd sentences failure                00       

В своем описании вы сказали, что thoughts будет самым длинным словом, но мой аллогритм обнаружил, что person's было таким же длинным.Если вы хотите удалить апостроф, вы можете выяснить, как это сделать, используя функцию str_remove_all().Я оставлю это для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...