Como posso classificar as observações no grupo mais rapidamente?

Eu tenho um problema muito simples, mas provavelmente não estou pensando em vetor suficiente para resolvê-lo com eficiência. Tentei duas abordagens diferentes e elas estão em loop em dois computadores diferentes há muito tempo. Eu gostaria de poder dizer que a competição tornou mais emocionante, mas ... b

rank observações no grupo

Tenho dados longos (muitas linhas por pessoa, uma linha por pessoa-observação) e basicamente quero uma variável, que me diga com que frequência a pessoa já foi observad

Tenho as duas primeiras colunas e quero oterceir 1

person  wave   obs
pers1   1999   1
pers1   2000   2
pers1   2003   3
pers2   1998   1
pers2   2001   2

Agora estou usando duas abordagens em loop. Ambos são terrivelmente lentos (150 mil linhas). Tenho certeza de que estou perdendo alguma coisa, mas minhas consultas de pesquisa ainda não me ajudaram (difícil definir o problema).

Obrigado por qualquer indicação!

# ordered dataset by persnr and year of observation
person.obs <- person.obs[order(person.obs$PERSNR,person.obs$wave) , ]

person.obs$n.obs = 0

# first approach: loop through people and assign range
unp = unique(person.obs$PERSNR)
unplength = length(unp)
for(i in 1:unplength) {
   print(unp[i])
   person.obs[which(person.obs$PERSNR==unp[i]),]$n.obs = 
1:length(person.obs[which(person.obs$PERSNR==unp[i]),]$n.obs)
    i=i+1
   gc()
}

# second approach: loop through rows and reset counter at new person
pnr = 0
for(i in 1:length(person.obs[,2])) {
  if(pnr!=person.obs[i,]$PERSNR) { pnr = person.obs[i,]$PERSNR
  e = 0
  }
  e=e+1
  person.obs[i,]$n.obs = e
  i=i+1
  gc()
}

questionAnswers(4)

yourAnswerToTheQuestion