首页 > 解决方案 > 如何创建一个将字符串作为输入并返回 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)

标签: rfunctionloopsvectorcharacter

解决方案


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

推荐阅读