如何创建一个以字符串为输入并返回R中一周中几天的矢量的函数



我是R的初学者,完全沉浸在家庭作业中。我假设创建一个函数,该函数以字符串作为输入,并返回一周中几天的矢量。如果拼写错误和部分天数不匹配,则天数将不会返回。日子也应该井然有序,星期一应该在星期二之前到来,等等。

样本输入:

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)
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()

另一个选项(使用上面的第一个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))

不确定您的讲师是否会允许您使用非标准的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"

相关内容

最新更新