Перебор слов по вектору строк и применение изменений к одному слову - PullRequest
0 голосов
/ 30 мая 2018

Данная строка:

words <- c("fauuucet water", "tap water")

Я хотел бы применить функцию toupper ко всем словам, которые содержат u.

Желаемые результаты

res <- c("FAUUCET water", "tap water")

Функция

change_u_case <- function(str) {
    sapply(
        X = str,
        FUN = function(search_term) {
            sapply(
                X = strsplit(search_term, split = "\\s", perl = TRUE),
                FUN = function(word) {
                    if (grepl(pattern = "u", x = word)) {
                        toupper(word)
                    }
                }
                ,
                USE.NAMES = FALSE
            )
        },
        USE.NAMES = FALSE
    )
}

Тесты

change_u_case(words) -> tst_res
words
tst_res
unlist(tst_res)

Примечания

  • В частности, меня интересует решение с использованием одногоrapply вызов может быть построен
  • rlist::list.iter подход был бы также интересен
  • Выбор слов, содержащих u символ является примером, на практике я хотел бы применить различные условия, отражающие длину и т. д.

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Вы можете использовать один sapply звонок, т.е.

sapply(strsplit(words, ' '), function(i) {i1 <- grepl('u', i); 
                                         i[i1] <- toupper(i[i1]); 
                                         paste0(i, collapse = ' ')
                                         })
#[1] "FAUUUCET water" "tap water"
0 голосов
/ 30 мая 2018

Попробуйте stringr:

str_replace_all(words, '\\w*u\\w*', toupper)
# [1] "FAUUUCET water" "tap water" 

Дополнительные примеры:

str_replace_all(c('Upset', 'day day up'), '\\w*u\\w*', toupper)
# [1] "Upset"      "day day UP"
0 голосов
/ 30 мая 2018

Вот решение на основе stringi:

library(stringi);
sapply(stri_extract_all_words(words),
    function(w) paste(ifelse(stri_detect(w, regex = "u"), toupper(w), w), collapse = " "))
#[1] "FAUUUCET water" "tap water"
...