【问题标题】:R - Define several step function for lapplyR - 为 lapply 定义几个步骤函数
【发布时间】:2020-04-26 08:49:43
【问题描述】:

您好,我有一份 SPX400 清单

我已经使用了 lapply 到子集:SPX400<- lapply(ALL400, function(x) x[x$ticker=="SPX",])

但是我现在想进一步过滤我的数据集,并尝试设置以下内容,定义 lapply 使用的函数:

    Usedfilter <- function(x) {
  mutate(fifteen = x[x$expirDate-x$trade_date-15]) %>% #making new vairable
  filter(fifteen >=0) %>% # filter on fifteen
  mutate(Stockandexpricedif = x[x$stkPx-x$strike]) %>% #making new variable
  filter(Stockandexpricedif < 10 & Stockandexpricedif > -10) # filter on Stockandexpricedif
}

SPXfilter <- lapply(SPX400, Usedfilter)

我收到以下错误:

 Error in is.data.frame(.data) : 
  argument ".data" is missing, with no default

希望你能帮助我。

这是SPX400的结构:

$ : tibble [2,498 × 37] (S3: tbl_df/tbl/data.frame)
  ..$ ticker          : chr [1:2498] "SPX" "SPX" "SPX" "SPX" ...
  ..$ stkPx           : num [1:2498] 1923 1923 1923 1923 1923 ...
  ..$ expirDate       : Date[1:2498], format: "2014-08-01" "2014-08-01" "2014-08-01" "2014-08-01" ...
  ..$ yte             : num [1:2498] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ strike          : num [1:2498] 1350 1375 1400 1425 1450 ...
  ..$ cVolu           : num [1:2498] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ cOi             : num [1:2498] 0 0 0 0 30 0 0 0 0 0 ...
  ..$ pVolu           : num [1:2498] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ pOi             : num [1:2498] 770 3573 2246 7984 20967 ...
  ..$ cBidPx          : num [1:2498] 569 544 519 494 469 ...
  ..$ cValue          : num [1:2498] 574 549 524 499 474 ...
  ..$ cAskPx          : num [1:2498] 581 556 531 506 481 ...
  ..$ pBidPx          : num [1:2498] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ pValue          : num [1:2498] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ pAskPx          : num [1:2498] 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 ...
  ..$ cBidIv          : num [1:2498] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ cMidIv          : num [1:2498] 0.00542 0.00567 0.00567 0 0.00567 0.00564 0.00567 0.00567 0.00567 0.00567 ...
  ..$ cAskIv          : num [1:2498] 0.0108 0.0113 0.0113 0 0.0113 ...
  ..$ smoothSmvVol    : num [1:2498] 0.321 0.327 0.333 0.333 0.235 ...
  ..$ pBidIv          : num [1:2498] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ pMidIv          : num [1:2498] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ pAskIv          : num [1:2498] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ iRate           : num [1:2498] 1e-04 1e-04 1e-04 1e-04 1e-04 1e-04 1e-04 1e-04 1e-04 1e-04 ...
  ..$ divRate         : num [1:2498] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ residualRateData: num [1:2498] -10 -10 -10 -10 -10 ...
  ..$ delta           : num [1:2498] 1 1 1 1 1 1 1 1 1 1 ...
  ..$ gamma           : num [1:2498] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ theta           : num [1:2498] -138 -141 -143 -146 -148 ...
  ..$ vega            : num [1:2498] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ rho             : num [1:2498] 0.000257 0.000261 0.000266 0.000271 0.000276 ...
  ..$ phi             : num [1:2498] -0.000366 -0.000366 -0.000366 -0.000366 -0.000366 ...
  ..$ driftlessTheta  : num [1:2498] -0.000975 -0.000993 -0.001011 -0.00103 -0.001047 ...
  ..$ extVol          : num [1:2498] 0.102 0.102 0.271 0.271 0.102 ...
  ..$ extCTheo        : num [1:2498] 593 568 543 518 493 ...
  ..$ extPTheo        : num [1:2498] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ spot_px         : logi [1:2498] NA NA NA NA NA NA ...
  ..$ trade_date      : Date[1:2498], format: "2014-08-01" "2014-08-01" "2014-08-01" "2014-08-01" ...
  ..- attr(*, "problems")= tibble [9,071 × 5] (S3: tbl_df/tbl/data.frame)
  .. ..$ row     : int [1:9071] 39322 39323 39324 39325 39326 39327 39328 39329 39330 39331 ...
  .. ..$ col     : chr [1:9071] "spot_px" "spot_px" "spot_px" "spot_px" ...
  .. ..$ expected: chr [1:9071] "1/0/T/F/TRUE/FALSE" "1/0/T/F/TRUE/FALSE" "1/0/T/F/TRUE/FALSE" "1/0/T/F/TRUE/FALSE" ...
  .. ..$ actual  : chr [1:9071] "68.38" "68.38" "68.38" "68.38" ...
  .. ..$ file    : chr [1:9071] "'OSMV-20140801.csv'" "'OSMV-20140801.csv'" "'OSMV-20140801.csv'" "'OSMV-20140801.csv'" ...

【问题讨论】:

  • 您可以使用dput(SPX400) 添加数据吗?
  • 数据真的很大。我尝试使用 SPX400[[1]] 仅访问其中一个列表,但它只返回 NULL。
  • 我现在尝试将日期作为因素,看看是否有帮助:SPXfacor &lt;- lapply(SPX400, function(x) x[as.factor(SPX400$expirDate)]) SPXfactor &lt;- lapply(SPXdataframe, function(x) x[as.factor(SPX400$trade_date)]) 现在我收到以下错误:Error in mutate(., fifteen = x[x$expirDate - x$trade_date - 15]) : is.data.frame(.data) || is.list(.data) || is.environment(.data) is not TRUE
  • 您能解释一下您要做什么吗?在每个列表中,您要选择哪些行以及要忽略哪些行?
  • 我想过滤我的数据,因此我在到期日期和当前日期之间以及 stkPx 价格和执行价格之间存在某些差异。我在列表中添加了日期之一的结构。

标签: r function lapply


【解决方案1】:

由于您的数据集是“大”,我建议您使用data.table。以下解决方案未经测试。

首先,将所有表格转换为data.table 格式:

library(data.table)
lapply(SPX400, setDT)

然后,定义一个泛型函数

Usedfilter <- function(df){
    df2 <- data.table::copy(df)
    df2[,fifteen := get('expirDate') - get('trade_date') - 15]
    df2 <- df[get('fifteen') > 0]
    df2[, ('Stockandexpricedif')  := get('stkPx') - get('strike')]
    #return(
    #  df2[between(get('Stockandexpricedif') , -10, 10, incbounds=FALSE)]
    #)
    return(df2[which.min(fifteen)])
}

然后,应用于所有数据框:

SPX400_filtered <- lapply(SPX400, Usedfilter)

【讨论】:

  • 很好的答案。但是,当我尝试使用您的代码时,我得到:Error in .checkTypos(e, names_x) : Object 'expirDate' not found amongst 错误在最后一步,尝试创建 SPX_400 过滤
  • 第一种可能,标准与非标准评估的问题。我更改了功能以提出标准评估。能解决问题吗?
  • 不,还是同样的问题
  • 查看结构时str(SPX400) 我得到:List of 400 $ :Classes ‘data.table’ and 'data.frame': 0 obs. of 0 variables ..- attr(*, ".internal.selfref")=&lt;externalptr&gt;
  • 创建空列表的是SPX400&lt;- lapply(ALL400, function(x) x[x$ticker=="SPX",]) 步骤。你最初有一个数据框,为什么要使用 lapply 和过滤器?
【解决方案2】:

尝试使用:

new_data <- Filter(length, SPX400)

SPXfilter <- lapply(new_data, function(df) subset(df, 
                  abs(expirDate - trade_date) >= 15 & abs(stkPx - strike) < 10))

这将选择expirDatetrade_date 之间的绝对差值大于等于15 天且stkPxstrike 之间的绝对差值小于10 的行。

【讨论】:

  • 这与@linog 的建议相同。我得到错误:Error in subset.default(df, abs(expirDate - trade_date) &gt;= 15 &amp; abs(stkPx - : object 'expirDate' not found
  • 看结构str,我需要把list.len设置在200以上,也就是数据集的长度,有什么要说的吗?例如。 str(SPX400, list.len = 200) 为所有数据帧返回 NULL,但str(SPX400, list.len = 400) 为列表中的每个数据帧返回一个结构列表。
  • 您可以尝试更新的答案吗?我认为有一些空列表需要先删除。
  • 我认为你是对的。数据似乎在 201:400 中,因此应删除前 200 个列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多