R dplyr: row-based conditions split/apply/combine

后端 未结 1 946
星月不相逢
星月不相逢 2021-01-16 17:38

This is the dplyr version of this question

I have the following data.table

initial.date <- as.POSIXct(\'2018-10-27 10:00:00\',tz=\'GM         


        
相关标签:
1条回答
  • 2021-01-16 18:14

    Solution using dplyr package and lapply function:

    result_df <- do.call(rbind, lapply(1:nrow(res), function(row_id) {
    
                 temp <-   res %>% filter(InstrumentSymbol == res$InstrumentSymbol[row_id]) %>% 
                           mutate(time_diff = abs(difftime(res$datetime[row_id], datetime, units = "secs")),
                                  diff_price = abs(TradePrice - res$TradePrice[row_id])) %>% 
                           filter(id != res$id[row_id], time_diff <= 60) %>% 
                           filter(diff_price == min(diff_price)) %>% select(TradePrice, id) %>% 
                           rename(minpricewithin60 = TradePrice, index.minpricewithin60 = id)
    
                 if(nrow(temp) == 0) temp[1,] <- c(NA, NA)
    
                 return(bind_cols(res %>% slice(rep(row_id, nrow(temp))), temp))
                                                                      }))
    
    head(result_df)
    
         PriorityDateTime TradePrice InstrumentSymbol id            datetime minpricewithin60 index.minpricewithin60
    1 2018-10-27 10:00:00          1           asset1  1 2018-10-27 10:00:00                3                      3
    2 2018-10-27 10:00:30          2           asset2  2 2018-10-27 10:00:30                4                      4
    3 2018-10-27 10:01:00          3           asset1  3 2018-10-27 10:01:00                1                      1
    4 2018-10-27 10:01:00          3           asset1  3 2018-10-27 10:01:00                5                      5
    5 2018-10-27 10:01:30          4           asset2  4 2018-10-27 10:01:30                2                      2
    6 2018-10-27 10:01:30          4           asset2  4 2018-10-27 10:01:30                6                      6
    
    0 讨论(0)
提交回复
热议问题