函数中使用的代码的不同输出,在R中单独使用

时间:2014-06-27 18:26:41

标签: r function subset

我一直在使用这类数据来评估我的毕业论文的一些股票

library(quantmod)
getSymbols("NOK",from="2012-01-01")
data<-NOK
p1<-4 
dC<-data[,4]
dO<-data[,1]
emaC<-EMA(dC,n=p1)
w1<-1.1
Profit_L_1<-((lag(dC,-1)-lag(dO,-1))/(lag(dO,-1)))*100
Profit_L_2<-((lag(dC,-2)-lag(dO,-1))/(lag(dO,-1)))*100
Profit_L_3<-((lag(dC,-3)-lag(dO,-1))/(lag(dO,-1)))*100
Profit_L_4<-((lag(dC,-4)-lag(dO,-1))/(lag(dO,-1)))*100
Profit_L_5<-((lag(dC,-5)-lag(dO,-1))/(lag(dO,-1)))*100
Profit_L_all<-ifelse(Profit_L_1>w1,Profit_L_1,
                     ifelse(Profit_L_2>w1,Profit_L_2,
                            ifelse(Profit_L_3>w1,Profit_L_3,
                                   ifelse(Profit_L_4>w1,Profit_L_4,
                                          ifelse(Profit_L_5>w1,Profit_L_5,Profit_L_5)))))
ChoosedN<-ifelse(Profit_L_all==Profit_L_1,1,
                 ifelse(Profit_L_all==Profit_L_2,2,
                        ifelse(Profit_L_all==Profit_L_3,3,
                               ifelse(Profit_L_all==Profit_L_4,4,
                                      ifelse(Profit_L_all==Profit_L_5,5,0)))))

Profit_day<-Profit_L_all/ChoosedN
Winloss<-ifelse(Profit_day>0.3,1,
                ifelse(Profit_day<=0.3,0,"nothing"))
Pos_emaC_dC_D<-emaC<dC
Pos_emaC_dC_UP<-emaC>dC
frame<-data.frame(Pos_emaC_dC_UP,Pos_emaC_dC_D,Profit_L_all,ChoosedN,Profit_day,Winloss)
colnames(frame)<-c("Pos_emaC_dC_UP","Pos_emaC_dC_D","Profit_L_all","ChoosedN","Profit_day","Winloss")
frame<-frame[complete.cases(frame),]

它的输出是我使用的data.frame,称为frame。很明显没有任何NA。

我已编写此函数以快速评估此框架中变量的组合

quickmycomb<-function (x,y){
  combination<-deparse(substitute(y))
  df<-subset(x,y)
  Success<-length(subset(df,Winloss==1)$Winloss)/length(df$Winloss)
  absnumber<-nrow(df)
  relnumber<-nrow(df)/nrow(frame)
  sl<-data.frame(Success,absnumber,relnumber)
  return(sl)
} 

当我使用此功能时

quickmycomb(frame,lag(Pos_emaC_dC_D,1) & Pos_emaC_dC_UP)

它表示输出是框架,在这种情况下为86行

    Success absnumber relnumber
1 0.6162791        86 0.1396104

但是当我使用这个函数的代码时 子集(框架,&#34;组合&#34;)具有相同的变量组合,如

subset(frame,lag(Pos_emaC_dC_D,1) & Pos_emaC_dC_UP)

它表示输出是带有0行的data.frame! 我不理解它,我认为正确的输出是第二个,但我不知道为什么它不能在函数中工作。 有什么建议应该是问题吗?

1 个答案:

答案 0 :(得分:0)

您不能将subset与条件的变量一起使用,因为子集本身将使用substitute来查看传递给函数的确切内容。但是,您可以将值传递给子集。一个解决方法是

quickmycomb.1 <- function (x,...) {
  df <- subset(x,...)
  Success <- length(subset(df,Winloss==1)$Winloss)/length(df$Winloss)
  absnumber <- nrow(df)
  relnumber <- nrow(df)/nrow(frame)
  sl <- data.frame(Success,absnumber,relnumber)
  return(sl)
}

备选方案,您可以使用

在函数内部自己处理子集
quickmycomb.2 <- function (x,y){
  combination <- eval(substitute(y), x, parent.frame())
  df <- x[combination, ]
  Success <- length(subset(df,Winloss==1)$Winloss)/length(df$Winloss)
  absnumber <- nrow(df)
  relnumber <- nrow(df)/nrow(frame)
  sl <- data.frame(Success,absnumber,relnumber)
  return(sl)
} 

当你同时运行它们时

quickmycomb.1(frame,lag(Pos_emaC_dC_D,1) & Pos_emaC_dC_UP)
quickmycomb.2(frame,lag(Pos_emaC_dC_D,1) & Pos_emaC_dC_UP)

他们都会产生

  Success absnumber relnumber
1     NaN         0         0

就像从当前环境中运行它一样。