我想在R中创建一个解决以下问题的函数。我有一个返回样本(调用此向量x
),每个都有一个相应的日期(调用此向量y
)。由于我们有退货,因此日期向量y
只有"交易日" (即从周一到周五)。我想创建一个执行以下操作的函数:
该函数有两个输入:日期和整数(正)。
R在日期向量y
中搜索用户输入的日期。
假设用户输入的整数为m
; m > 0
。现在,R采用指定日期和m
日期之前的日期。 (如果m < 0
,R必须告诉您错误。)
R根据y
以及返回向量m
对日期向量x
进行子集。
为了举个例子,我们假设我有"%m/%d/%Y"
格式的5个日期。
01/01/2016 -2%
01/04/2016 +3%
01/05/2016 +1%
01/06/2016 -5%
01/07/2016 +3%
现在,如果我进入函数:f(01/06/2016, 2)
,那么我将留下:
01/05/2016 +1%
01/06/2016 -5%
我知道这是非常具体的,但它会教会我很多关于子集的内容。 (我还没有找到类似的东西。)
答案 0 :(得分:0)
y <- c(Sys.Date(),Sys.Date()+2,Sys.Date()+1,Sys.Date()-1,Sys.Date()-2,Sys.Date()-3)
x <- c(10,100,12,13,14,15)
df <- data.frame(y,x)
myfun <- function(d=d,m=0){
# R searches in the date vector y for the date entered by the user.
# Say the integer entered by the user was m; m > 0.
# Now, R takes the specified date and m dates BEFORE that one.
# (If m < 0, R must tell you there's an error.)
if(m < 0){
cat("I must tell you, there's an error!") #trycatch is better
}
d <- as.Date(d)-m
print(d)
df1 <- df[df$y < (d+1),]
return(df1)
}
myfun("2016-06-09", 0)
[1] "2016-06-09"
y x
1 2016-06-09 10
4 2016-06-08 13
5 2016-06-07 14
6 2016-06-06 15
这应该可以解决问题。没什么太花哨的。您必须确保以正确的格式输入日期。
如果您想改进这一点,您可以使用format
或包lubridate
制作一些控制流逻辑来接受任何日期格式和/或您可以使用tryCatch
处理错误(请参阅?tryCatch
)。