过滤R中的选项数据

时间:2015-06-25 05:37:21

标签: r filter

我有这样的数据数据

Date           Closing_price    strike_Price  Underlying_Value
01-01-2015     12                120           109     
01-01-2015     10                110           109
01-01-2015     5                 130           109
01-01-2015     3                 140           109
01-01-2015     15                100           109
01-01-2015     25                90            109

我想要的只是那些执行价格刚好高于底层价值并且刚好低于基础价值的那些行。如果Underlying_Valuestrike_Price匹配,那么我只想要单行。

期望输出:(在这种情况下)

 01-01-2015     10                110           109
 01-01-2015     15                100           109

同样,我有各种日期的数据。 Underlying_Value仅在不同日期之间有所不同。我希望为每个日期过滤这样的数据并将它们保存为数据框(在单个对象中,而不是分别用于每个日期)。

我设法编写代码,但这花费了太多时间。对于观察82000,大约时间是3分钟。

我想知道,他们是否有效?

我做了什么:

1)首先在数据集中创建另一个变量df1 $ money&lt ;-(df1 $ Underlying_Value-df1 $ Strike_Price)/ df1 $ Underlying_Value, 2)使用循环,首先选择行,其中df1 $ money大于0并且选择行具有df1 $ money的最小值,而不是df1 $ money小于0,我选择的行具有df1 $ money的最大vaule。

它奏效了,但是花了太多时间......

我的确切代码是:

atmoney <- function(data) {

Date.i <- unique(data$Date)

len <- length(Date.i)

data$money <- (data$Underlying.Value-data$Strike.Price)/data$Strike.Price

at.first.row <- data[1,]

for(i in 1:len) {

data.f <- data[data$Date==Date.i[i],]

data.f.1 <- data.f[data.f$money >=0,]

data.at.1 <- data.f.1[data.f.1$money==min(data.f.1$money),]

data.f.2 <- data.f[data.f$money <= 0,]

data.at.2 <- data.f.2[data.f.2$money == max(data.f.2$money),]

at.first.row <- rbind(at.first.row,data.at.1, data.at.2)


}

desired_data <- at.first.row[-1,] #removed first row
}

2 个答案:

答案 0 :(得分:2)

您可能需要一个截止值来过滤。使用上面的示例,如果我使用10作为截止限制

 subset(df1, abs(strike_Price - Underlying_Value)<10)
 #        Date Closing_price strike_Price Underlying_Value
 #2 01-01-2015            10          110              109
 #5 01-01-2015            15          100              109

对于多个日期,以上也可以

使用data.table

 library(data.table)
 setDT(df1)[abs(strike_Price - Underlying_Value)<10]
 #         Date Closing_price strike_Price Underlying_Value
 #1: 01-01-2015            10          110              109
 #2: 01-01-2015            15          100              109

更新

根据编辑,您可以尝试

 library(data.table)
 setDT(df1)[, money:=(Underlying_Value-strike_Price)/Underlying_Value]
 indx1 <- df1[money <0, .I[which.max(money)], Date]$V1
 indx2 <- df1[money >= 0, .I[which.min(money)], Date]$V1
 df1[c(indx1,indx2)][,money:=NULL]
 #            Date Closing_price strike_Price Underlying_Value
 #1: 01-01-2015            10          110              109
 #2: 01-01-2015            15          100              109

答案 1 :(得分:0)

我在您的示例中添加了第二个日期,以说明多个日期。这为您提供了每天的最低价值。您可以将公式调整为您需要的公式。

  library(dplyr)

  df1pos <-df1 %>% mutate(diff = (Strike_Price - Underlying_Value)) %>% group_by(Date) %>% filter( diff > 0) %>%  filter(diff == min(diff))
  df1neg <- df1 %>% mutate(diff = (Strike_Price - Underlying_Value)) %>% group_by(Date) %>% filter( diff < 0) %>%  filter(diff == max(diff))
  dftotal <- union(df1pos, df1neg)

  dftotal

  Date Closing_price Strike_Price Underlying_Value diff
  1 01-01-2015            15          100              109   -9
  2 02-01-2015            15          100              108   -8
  3 01-01-2015            10          110              109    1
  4 02-01-2015            10          110              108    2

我认为该组需要延长,以显示不同的股票。但是你的例子并不清楚。