2017-03-05 5 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 A:(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 

あなたは、私が包み、これは上で行われる必要があり、より多くの列がある追加する必要があり、あなたがあなたをそれらをすべて書き出したくないdata.table

に戻って日付をCBINDすることができますこのようなことをすることができます。

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

これは、data.tableのすべての列にこの機能を適用します。

+0

Rは私にエラーを与えます。関係関数で "test"を見つけることができません。 – Henky

+0

@Henkyコードを修正しました。 – Kristofersen

0

shureのためにもっとエレガングの解決策があるかもしれません。

> 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 
関連する問題