No ave?
frame$z <- with(frame, ave(y,x,FUN=seq_along) )
frame
Version A data.tablemay be something like lower (thanks to @mnel):
#library(data.table)
#frame <- as.data.table(frame)
frame[,z := seq_len(.N), by=x]
My initial thought was to use:
frame[,z := .SD[,.I], by=x]
.SD data.table split by x. .I data.table. , .SD[,.I] . , @mnel, , .SD , .