в базе 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()
}