Search code examples
rsubsetlapplyquantmod

Subsetting only positive values of specific column in a list


I have the following code to get options data list and create a new list to get only puts data (only_puts_list)

  library(quantmod)
  Symbols<-c  ("AA","AAL","AAOI","ABBV","ABC","ABNB")
  Options.20221111 <- lapply(Symbols, getOptionChain)
  names(Options.20221111) <- Symbols
  only_puts_list <- lapply(Options.20221111, function(x) x$puts)

I'd like now to subset the only_puts_list and create a new list (i.e. new_list1) to subset and get only the data which has a positive value in the column ChgPct of the only_puts_list.

I guess lapply should work, but how to apply to only positive values of a specific column ChgPct?


Solution

  • We could use subset after looping over the list with lapply

    new_list1 <- lapply(only_puts_list, subset, subset = ChgPct > 0)
    

    If we check the output, most of the list elements returned have only 0 rows as there were no positive observations in 'ChgPct'. We could Filter to keep only those having any rows

    new_list1_sub <-  Filter(nrow, new_list1)
    

    -output

    new_list1_sub
    $ABBV
                ContractID ConractSize Currency Expiration Strike Last       Chg   ChgPct  Bid  Ask Vol  OI       LastTradeTime        IV
    31 ABBV221202P00155000     REGULAR      USD 2022-12-02  155.0 0.66 0.1100000 20.00000 0.56 0.66  70 480 2022-11-29 13:10:43 0.2690503
    32 ABBV221202P00157500     REGULAR      USD 2022-12-02  157.5 1.49 0.2400000 19.20000 1.41 1.51 544 383 2022-11-29 13:17:43 0.2627027
    33 ABBV221202P00160000     REGULAR      USD 2022-12-02  160.0 3.05 0.4300001 16.41222 2.79 2.99  34 308 2022-11-29 12:07:54 0.2692944
    34 ABBV221202P00162500     REGULAR      USD 2022-12-02  162.5 4.95 1.6499999 50.00000 4.80 5.05   6  28 2022-11-29 13:26:10 0.3017648
         ITM
    31 FALSE
    32 FALSE
    33  TRUE
    34  TRUE
    
    $ABC
               ContractID ConractSize Currency Expiration Strike Last       Chg  ChgPct Bid Ask Vol  OI       LastTradeTime        IV   ITM
    18 ABC221202P00165000     REGULAR      USD 2022-12-02    165 1.05 0.1999999 23.5294 0.6 0.8   3 111 2022-11-29 09:51:47 0.2710034 FALSE