检查变量是否返回到r中滚动窗口中的上一级别

时间:2017-08-28 00:32:30

标签: r date dplyr data.table

我正在尝试创建一个函数来应用于数据框中的变量,对于当前观察前3天的窗口,计算当前价格是否下降然后返回到原始价格。数据框如下所示:

var fileProvider= new FileExtensionContentTypeProvider();
fileProvider.Mappings.Add(".ts", "text/x.typescript");

app.UseStaticFiles(new StaticFileOptions() { ContentTypeProvider = fileProvider});

VarA VarB Date Price Diff VarD 1 1 2007-04-09 50 NA 0 1 1 2007-04-10 50 0 0 1 1 2007-04-11 48 -2 1 1 1 2007-04-12 48 0 1 1 1 2007-04-13 50 2 0 1 1 2007-04-14 50 0 0 1 1 2007-04-15 45 -5 1 1 1 2007-04-16 50 5 0 1 1 2007-04-17 45 -5 0 1 1 2007-04-18 48 3 0 1 1 2007-04-19 48 0 0 1 1 2007-04-20 50 2 0 VarA是分组变量(在此示例中,它们不会更改),VarB是我希望检测的变量,如果它减少然后再增加到起始级别,Price是滞后价格差异(如果有任何帮助)。

Diff显示应用我想要猜测的函数的结果。 VarD取值VarD有两个条件:1)价格从某个级别降低,然后在接下来两天的任何窗口中返回到原始水平(即50至48,再次至50,在行2至5,或50至45,再在行6至8中为50); 2)最多有两天价格再次上涨到起始水平。否则,1应采用值VarD

我对如何开始没有任何线索。

数据框0是:

db

提前致谢。

2 个答案:

答案 0 :(得分:0)

希望我能正确理解您的要求:

library(dplyr)

db %>%
  #create Diff.2 as helper variable: increase in price from current day to 2 days later
  mutate(Diff.2 = diff(c(Price,NA,NA), lag = 2)) %>% 
  mutate(Var.D = ifelse(
      Diff.2 + lag(Diff.2, 2) == 0 & #condition 1: price increase from current day to 2 days later 
                                     #is cancelled out by price decrease from 2 days ago to current day
      Diff.2 > 0,                    #condition 2: price increases from current day to 2 days later
    1, 0)) %>%
  mutate(Var.D = ifelse(is.na(Var.D), 0, Var.D)) %>%
  select(-Diff.2)

   VarA VarB       Date Price Diff Var.D
1     1    1 2007-04-09    50   NA     0
2     1    1 2007-04-10    50    0     0
3     1    1 2007-04-11    48   -2     1
4     1    1 2007-04-12    48    0     1
5     1    1 2007-04-13    50    2     0
6     1    1 2007-04-14    50    0     0
7     1    1 2007-04-15    48   -2     0
8     1    1 2007-04-16    49    1     0
9     1    1 2007-04-17    45   -4     0
10    1    1 2007-04-18    45    0     0
11    1    1 2007-04-19    45    0     0
12    1    1 2007-04-20    50    0     0

答案 1 :(得分:0)

我认为我找到了解决方案,如果感兴趣的话。我使用来自@G的输入。格洛腾迪克所以他应得的大部分功劳(但不是错误的责任)。解决方案分为四个步骤:

步骤1:如果价格下降,则创建一个等于1的虚拟变量,并且每个月保持低位。

db$Tmp1 <- 0

 for (n in 1 : length(db$Date)) db$Tmp1[n] <- ifelse 
  (db$Diff[n] < 0, 1, ifelse (db$Tmp1[n-1:min(0, n)] == 1 && 
   db$Diff[n] == 0, 1, 0))

ifelse的第一部分告诉我,如果date [n]的价格下降,或者前一个Step1的值等于1且价格没有变化,那么请指定值1,否则为0。

第2步:将步骤1中价格降低的天数限制为两天(感谢@G.Grothendieck)。

loop <- function(x) if (all(x[-1] == 1)) 0 else x[1]
db$Tmp2 = ifelse(db$Diff < 0, rollapply(db$Tmp1, 3, loop, partial = T, 
                 align = "left"), ifelse(db$Diff==0 & lag(db$Tmp2) == 
                   1, 1, 0))

loop是一个函数,如果所有值(当前日期除外)等于1,则值为0,否则取Tmp1的值。然后,如果价格下降(db$diff&lt; 0)将loop应用于Tmp1前进的3个值,但是如果价格没有变化且前一个值Tmp2为1,赋值为1. Else赋值为0.

第3步:计算价格下降之前的价格是否会在原始价格的三天内重复。

loop2 <- function(x) if (any(x[-1] == x[1])) 1 else 0
Tmp3 = rollapply(Price, 4, loop2, partial = T, align = "left")

函数loop2搜索是否在当前日期的3天内重复任何价格(Tmp3函数中的4)。然后,Tmp3loop2应用于Price向量(在此Ifelse statement with dataframe subset using date之后)

第4步:Tmp2Tmp3相乘以获得结果(并删除辅助变量)。

db$Sale <- db$Tmp2 * db$Tmp3
db$Tmp1 <- db$Tmp2 <- db$Tmp3 <- NULL

现在,Sale只是乘以Tmp2Tmp3,因为第一个将销售调整为3天的窗口,第二个显示原始价格是否为开头价格下跌的价格出现在3天前的窗口。

希望它对任何人都有用。如果有任何更正或建议,我们非常欢迎。最后,每个代码都应该应用于每个VarAVarB,因此每个步骤都应该在以下代码中:

db <-
  db %>% group_by(VarA, VarB) %>%
  mutate(
code
)

输出结果为:

      VarA  VarB   Date     Price  Diff  Tmp1  Tmp2  Tmp3  Sale
     <int> <int>  <fctr>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1     1     1 2007-04-09    50     0     0    NA     1    NA
 2     1     1 2007-04-10    50     0     0     0     1     0
 3     1     1 2007-04-11    48    -2     1     1     1     1
 4     1     1 2007-04-12    48     0     1     1     1     1
 5     1     1 2007-04-13    50     2     0     0     1     0
 6     1     1 2007-04-14    50     0     0     0     0     0
 7     1     1 2007-04-15    48    -2     1     1     0     0
 8     1     1 2007-04-16    49     1     0     0     0     0
 9     1     1 2007-04-17    45    -4     1     0     1     0
10     1     1 2007-04-18    45     0     1     0     1     0
11     1     1 2007-04-19    45     0     1     0     0     0
12     1     1 2007-04-20    50     5     0     0     0     0

非常感谢。