在日期上进行子集,在R中起作用

时间:2016-06-09 22:45:39

标签: r function date subset

我想在R中创建一个解决以下问题的函数。我有一个返回样本(调用此向量x),每个都有一个相应的日期(调用此向量y)。由于我们有退货,因此日期向量y只有"交易日" (即从周一到周五)。我想创建一个执行以下操作的函数:

该函数有两个输入:日期和整数(正)。

  1. R在日期向量y中搜索用户输入的日期。

  2. 假设用户输入的整数为m; m > 0。现在,R采用指定日期和m日期之前的日期。 (如果m < 0,R必须告诉您错误。)

  3. R根据y以及返回向量m对日期向量x进行子集。

  4. 为了举个例子,我们假设我有"%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%
    

    我知道这是非常具体的,但它会教会我很多关于子集的内容。 (我还没有找到类似的东西。)

1 个答案:

答案 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)。