Как создать функцию, которая принимает символьную строку в качестве входных данных и возвращает вектор дней недели в R? - PullRequest
1 голос
/ 20 марта 2020

Я новичок в R и полностью потерян с домашней работой. Я предполагаю создать функцию, которая принимает строку символов в качестве входных данных и возвращает вектор дней недели. Дни не будут совпадать с неправильным написанием и неполными днями. Дни также должны быть в порядке, понедельник должен предшествовать вторнику и т. Д. c.

Пример ввода:

days.present(mystr = "Dinner on Monday, tuesday, Wed, or Tursday?")
days.present("SundayMonday")
days.present("Are we meeting today?")

Выходные данные должны быть такими:

[1] "Monday" "Tuesday"
[1] "Sunday" "Monday"
character(0)

Ответы [ 2 ]

2 голосов
/ 20 марта 2020
vec <- c("Dinner on Monday, tuesday, Wed, or Tursday?",
         "SundayMonday",
         "Are we meeting today?")

# a generic way of finding locale-friendly weekdays
wdays <- weekdays(Sys.Date() + 0:6)
wdays <- paste(wdays, collapse = "|")
wdays
# [1] "Thursday|Friday|Saturday|Sunday|Monday|Tuesday|Wednesday"

lapply(
  regmatches(vec, gregexpr(wdays, vec, ignore.case = TRUE)),
  tools::toTitleCase
)
# [[1]]
# [1] "Monday"  "Tuesday"
# [[2]]
# [1] "Sunday" "Monday"
# [[3]]
# list()

Другой вариант (используя first days выше, вектор длины 7).

wdays <- weekdays(Sys.Date() + 0:6)
lapply(vec, function(v) wdays[sapply(wdays, grepl, x = v, ignore.case = TRUE)])
# [[1]]
# [1] "Monday"  "Tuesday"
# [[2]]
# [1] "Sunday" "Monday"
# [[3]]
# character(0)

# also
lapply(vec, function(v) Filter(function(w) grepl(w, v, ignore.case = TRUE), wdays))
1 голос
/ 20 марта 2020

Не уверен, разрешит ли ваш инструктор использовать нестандартные пакеты R. В пакете stringr есть классная функция для извлечения строк, называемая str_extract_all.

mystr1 <- "Dinner on Monday, tuesday, Wed, or Tursday?"
mystr2 <- "SundayMonday"
mystr3 <- "Are we meeting today?"

days.present <- function(mystr) {
  x <- tools::toTitleCase(mystr)
  dow <- c("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday")
  days <- paste0(dow, collapse="|")
  library(stringr)
  as.character(sort(factor(unique(stringr::str_extract_all(x, days)[[1]]), levels=dow)))
}

days.present(mystr1)
[1] "Monday"  "Tuesday"

days.present(mystr2)
[1] "Sunday" "Monday"

days.present(mystr3)
character(0)

mystr4 <- ("saturday, Saturdays, Friday, thursday, + Wednesday, TueSday, Monday, SundaY")

days.present(mystr4)
[1] "Monday"    "Wednesday" "Thursday"  "Friday"    "Saturday"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...