根据与同一列中先前值的特定关系删除值

时间:2017-03-05 17:14:56

标签: r

我有几家公司的每日股票回报数据,需要删除那些与之前(=前一天)返回值有特定关系的值。 在数学公式中,它看起来像这样:(1 + r)*(1 + e)-1 <= 50%,其中r是当天的回报,e是前一天的回报,至少是r或e大于100%。 数据框DF看起来像那样。

Date          A     B     C     D
01.01.2015    0.15  0.17  0.70  0.65
02.01.2015    1.01  0.75  0.01  -0.18
01.02.2015    -0.50  0.64  1.20  0.1
06.02.2015    0.12  0.54  0.13  1.50
01.03.2016    0.45  0.54  1.89  0.56

这个过滤器DF应该看起来像这样。

Date          A     B     C     D
01.01.2015    0.15  0.17  0.70  0.65
02.01.2015    1.01  0.75  0.01  -0.18
01.02.2015    NA    0.64  1.20  0.1
06.02.2015    0.12  0.54  0.13  1.50
01.03.2016    0.45  0.54  1.89  0.56

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

我会试试这个:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    #Removes access to the system folder by users.
    #Additionally this will allow you to create a System.php controller,
    #previously this would not have been possible.
    #'system' can be replaced if you have renamed your system folder.
    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #When your application folder isn't in the system folder
    #This snippet prevents user access to the application folder
    #Submitted by: Fabdrol
    #Rename 'application' to your applications folder name.
    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #Checks to see if the user is attempting to access a valid file,
    #such as an image or css document, if this isn't true it sends the
    #request to index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

<IfModule !mod_rewrite.c>
    # If we don't have mod_rewrite installed, all 404's
    # can be sent to index.php, and everything works as normal.
    # Submitted by: ElliotHaughin

    ErrorDocument 404 /index.php
</IfModule>

...生成:

library(tidyverse)

check_fn <- function(Z){
  ifelse(((lag(Z, n=1) > 1 | Z >1) & ((1+lag(Z, n=1))*(1+Z) <= 1.5)), NA, Z)
}

Y <- X %>% 
  mutate_at(vars(2:5), check_fn)

Y[1, 2:5] <- X[1, 2:5]

Y

我希望它可以帮到你。

答案 1 :(得分:0)

抱歉,我误读了你的一些帖子。我已更正它,因此它与您的预期输出相符。

library(data.table)
setDT(dat)
dat = dat[ , lapply(.SD, relationship), .SDcols = c("A", "B", "C", "D")]

relationship = function(x){
  return(ifelse(((1 + x)*(1 + shift(x)) - 1) < .5 & !is.na(shift(x)) & (x > 1 | shift(x) > 1), NA, x))
}

> dat[ , lapply(.SD, relationship), .SDcols = c("A", "B", "C", "D")]
      A    B    C     D
1: 0.15 0.17 0.70  0.65
2: 1.01 0.75 0.01 -0.18
3:   NA 0.64 1.20  0.10
4: 0.12 0.54 0.13  1.50
5: 0.45 0.54 1.89  0.56

您可以将日期重新绑定到data.table

我应该添加,因为还有更多的列需要完成,而你不想全部写出来,你可以做这样的事情。

Dates = dat$Date
dat[ , "Date" := NULL]
dat = dat[ , lapply(.SD, relationship)]

这会将该函数应用于data.table中的每一列。

答案 2 :(得分:0)

可能会有更好的解决方案。

> M=matrix(c(0.15,0.17,0.70,0.65,1.01,0.75,0.01,-0.18,-0.50,0.64,1.20,0.1,0.12,0.54,0.13,1.50,0.45,0.54,1.89,0.56),nrow = 5, byrow = TRUE)
> M
      [,1] [,2] [,3]  [,4]
[1,]  0.15 0.17 0.70  0.65
[2,]  1.01 0.75 0.01 -0.18
[3,] -0.50 0.64 1.20  0.10
[4,]  0.12 0.54 0.13  1.50
[5,]  0.45 0.54 1.89  0.56
> ifelse(rbind(c(T,T,T,T), !(((M[2:5,]>1)|(M[1:4,]>1))&(((1+M[2:5,])*(1+M[1:4,])-1)<.5))), M, NA)
     [,1] [,2] [,3]  [,4]
[1,] 0.15 0.17 0.70  0.65
[2,] 1.01 0.75 0.01 -0.18
[3,]   NA 0.64 1.20  0.10
[4,] 0.12 0.54 0.13  1.50
[5,] 0.45 0.54 1.89  0.56