This is a pretty old thread, but for reference: here is the data.table solution using the same data as @Ram:
structure(list(Date = structure(c(10957, 10987, 10988, 11015, 11017, 11047, 11087, 11099, 11112, 11141, 11168, 11319, 11321), class = "Date"), Value = c(10, 10.1, 10.2, 11, 10, 24.1, 510, 522, 604, 10.1, 7.2, 11, 3)), .Names = c("Date", "Value"), row.names = c(NA, -13L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x00000000001b0788>)
This is essentially a single line that uses the data.table::month function:
library(data.table) setDT(df)[ , diff(Value) / Value[1], by= .(month(Date))]
This will result in a change with respect to the first recorded day in each month. If the change relative to last day is preferred, then the expression in the middle should be changed to diff(Value) / Vale[2] .