Here is one way: split and lapply :
> tmp <- lapply(split(d, list(d$date)), function(x) if(all(c('P', 'C') %in% x[, 5])) x) > do.call(rbind, tmp) myIdx strike_price date exdate cp_flag strike_price return 1996-05-18.1 8355342 605000 1996-04-02 1996-05-18 P 605000 0.002340 1996-05-18.2 8355433 605000 1996-04-02 1996-05-18 C 605000 0.002340 1996-05-18.3 8356541 605000 1996-04-09 1996-05-18 P 605000 -0.003182 1996-05-18.4 8356629 605000 1996-04-09 1996-05-18 C 605000 -0.003182 1996-05-18.5 8358033 605000 1996-04-16 1996-05-18 P 605000 0.003907 1996-05-18.6 8358119 605000 1996-04-16 1996-05-18 C 605000 0.003907 1996-05-18.7 8359391 605000 1996-04-23 1996-05-18 P 605000 0.005695
Edit: here the full version is implied by my last answer. I tend to think in basic functions, not plyr or reshape ... but these answers seem good too.
source share