[英]How to create a function that takes a character string as input and returns a vector of the days of the week in 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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.