2017-03-05 23 views
1

我有幾家公司的每日股票收益數據,需要刪除那些與前一(=前一天)返回值具有特定關係的值。 在一個數學公式中,它看起來像這樣:(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 

感謝您的幫助!

+0

你能解釋你是如何從輸入到輸出的? 我認識的唯一差異是在1.2.2015/A. 和1.2.2015/B有什麼區別? –

+0

1.2.2015答:(1 +( - 0.5)*(1 + 1.01)-1 = 0.005 ergo <50%(0.5)和e在這種情況下大於100%(1.0) 1.2.2015 B:我沒有看到一個案例,這需要完成 – Henky

回答

1

我想試試這個:

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 

...產生:

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

我希望它可以幫助你。

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 

可以cbind的歷史可以追溯到到data.table

我要補充櫃面有更多的列,這需要在做,你不希望他們全部寫出來,你可以做這樣的事情。

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

這會將函數應用於data.table中的每一列。

+0

R給我一個錯誤,它在關係函數中找不到「test」 – Henky

+0

@Henky我修復了代碼,它現在應該可以工作了。 – Kristofersen

0

有可能是一個更eleang解決方案。

> 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