Efficient date-based lookup function in R
Have a look at the function findInterval. It is vectorized so it can treat all your dates in a single (fast) call. Your code should look something like this:

eastern.profile &lt;- function(birthday) {
   bad &lt;- !is.na.POSIXlt(birthday)
   birthday[bad] &lt;- strptime(birthday[bad], format = "%Y-%m-%d", tz = "Asia/Chongqing")
   ind &lt;- findInterval(birthday, lunarCal$START_DATE)
   cbind(birthday = birthday, lunarCal[ind, ])
}


Note that I was not able to test because of some issues I had with your data. So it may need some tweaks.