Something like this I think:
df$new <- with(df,ave(sequence(nrow(df)),list(statenum,casenum),FUN=length))
> df
statenum casenum vnumber pnumber numfatal new
1 48 3081 1 1 1 1
2 48 3080 5 1 1 5
3 48 3080 4 1 1 5
4 48 3080 1 1 1 5
5 48 3080 2 1 1 5
6 48 3080 3 1 1 5
7 48 3079 1 1 1 1
8 47 3080 1 1 1 9
9 47 3080 3 4 1 9
10 47 3080 2 3 1 9
11 47 3080 3 2 1 9
12 47 3080 2 2 1 9
13 47 3080 3 3 1 9
14 47 3080 2 1 1 9
15 47 3080 4 1 1 9
16 47 3080 3 1 1 9
17 47 3077 2 1 1 1
You may also be interested in the "data.table" package:
library(data.table)
DT <- data.table(df)
DT[, new_col := .N, by = list(statenum, casenum)]