в базе R:

я действительно простая проблема, но я, вероятно, не думаю, что вектор-y достаточно для ее эффективного решения. Я попробовал два разных подхода, и они уже давно зацикливались на двух разных компьютерах. Хотелось бы сказать, что соревнование сделало его более захватывающим, но ... блин.

ранговые наблюдения в группе

У меня есть длинные данные (много строк на человека, одна строка на человека-наблюдение), и я в основном хочу переменную, которая говорит мне, как часто человек уже наблюдался.

У меня есть первые две колонки и хочутретий один:

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

Сейчас я использую два петлевых подхода. Оба мучительно медленны (150 тыс. Строк). Я уверен, что что-то упустил, но мои поисковые запросы мне пока не очень помогли (сложно сформулировать проблему).

Спасибо за любые указатели!

# 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()
}

Ответы на вопрос(3)

Ваш ответ на вопрос