【发布时间】:2011-09-03 23:55:01
【问题描述】:
我有一个非常简单的问题,但我可能没有想到足够有效地解决它。我尝试了两种不同的方法,它们已经在两台不同的计算机上循环了很长时间。我希望我可以说比赛让它更令人兴奋,但是...... bleh。
对组中的观察进行排名
我有很长的数据(每人多行,每人观察一行),我基本上想要一个变量,它告诉我已经观察到这个人的频率。
我有前两列,想要第三一列:
person wave obs
pers1 1999 1
pers1 2000 2
pers1 2003 3
pers2 1998 1
pers2 2001 2
现在我使用两种循环方法。两者都非常缓慢(150k 行)。我确定我遗漏了一些东西,但我的搜索查询并没有真正帮助我(很难说出问题)。
感谢您的指点!
# 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()
}
【问题讨论】:
标签: optimization r