调节数据帧

时间:2017-07-23 20:47:47

标签: r if-statement dataframe

我正在建立一个数据框来决定何时买入和卖出股票。

我的第一个数据框看起来像这样,其中观察值是给定时间点给定比率的百分比顺序。

AAPL <- c(0.25,0.25,0.25,0.5,0.5,0.75,0.5,1,1,0.5,0.5,0.5,0.25)
df <- data.frame (AAPL)

我想写一个条件,如果观察值低于0.4,我想买入股票(1),如果高于0.6,我想卖出(-1)。

我想要的是这样的东西我从来没有买过我尚未售出的股票。

AAPL.new <- c(1,0,0,0,0,-1,0,0,0,0,0,0,1)
df.new <- data.frame (AAPL.new)

到目前为止,我已经构建了以下功能:

selection <- function(x) {
sapply(seq_along(x), function(i){
    if (i==1 & x[1]<0.4) {
        1
    } else if (is.na(x[i])) {
        0
    } else if (x[i] < 0.4 & is.na(x[i-1])) {
        1
    } else if (x[i] < 0.4 & x[i-1] > 0.4) {
        1
    } else if (x[i] > 0.6 & is.na(x[i-1])) {
        -1
    } else if (x[i] > 0.6 & x[i-1] < 0.6) {
        -1
    } else {
        0
    }        
})
}

但是,此函数产生的结果是:

AAPL.new <- c(1,0,0,0,0,-1,0,-1,0,0,0,0,1)

这是错误的,因为我在没有购买的情况下卖出两倍的股票(在观察6和8中以两个“-1”表示)。

我是一名初学者,从Excel中的小样本转移到R中的大样本。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

根据我的理解!!!: 。第一个aapl和boolean canibuy作为全局变量。 canibuy是一种变种,可以帮助您了解您的购买或销售水平。

aapl<<-c(0.25, 0.25, 0.25, 0.5, 0.5, 0.75, 0.5, 1, 1, 0.5, 0.5, 0.5, 
0.25)
canibuy<<-T

 iequal1<-function(xi){
 retvalue<-0

                            if(is.na(xi)) {retvalue<-0
                                        } else if(xi<.4){
                                            retvalue<-1;canibuy<<-F     
                                                    }else  {
                                                  retvalue<-0;canibuy<<-T

                                                       }
return(retvalue)
 }
 ####check with values
  iequal1(0);canibuy
 iequal1(.5);canibuy
  iequal1(.6);canibuy

  inotequal1<-function(i){
  retvalue<-0
  if(canibuy){
    if(is.na(aapl[i])) { retvalue<-0
                       }else if(aapl[i]<.4){
                                               retvalue<-1;canibuy<<-F
                                              }else{
                                                      retvalue<-0
                                                    }
   }else  {
             if(is.na(aapl[i])) { retvalue<-0
                           }else if(aapl[i]>.6){
                                      retvalue<--1;canibuy<<-T
                                                   }else{
                                                        retvalue<-0
                                                        }

            }
return(retvalue)
}

selection<-function(){
sapply(seq_along(aapl),function(i){
                   retvalue<-0

                    if(i==1){##i==1
                             retvalue<-iequal1(aapl[i])
                            }else{ 
                                              retvalue<-inotequal1(i)
                                    }
                        return(retvalue)
                            }


 )
 }

selection()
##[1]  1  0  0  0  0 -1  0  0  0  0  0  0  1