我有访问日期和个人ID的数据:
n <- 1e6
set.seed(42L)
DT <- data.table(id = sample(1:37000, n, replace=TRUE),
date = as.Date("1963-07-13", "%Y-%m-%d")
- sample(1:9000, n, replace=TRUE))
我正在添加一个变量,对每个人的访问进行排名。访问#1,#2等。如果我无法区分两次访问,他们可以按任何(一致)方式排名。
在我上一次question之后(关于效率),我意识到我应该学习如何使用data.table
。所以我目前的解决方案是使用data.table - 唯一的问题是该命令需要几秒钟才能运行。
> system.time(DT[, visit.n := rank(date, ties.method="first"), by = id]
+ )
user system elapsed
4.42 0.02 4.44
我想知道我是在做“错误”的事情,还是只需要耐心等待继续前进。
答案 0 :(得分:4)
取自我的评论:
正如@Frank指出的那样,setkey
不是必需的。只需使用order(date)
即可对日期进行排名。我还将日期保存为整数。
system.time({
DT[, date := as.IDate(date)][order(date), visit.n := 1:.N, by=id]
})
user system elapsed
0.126 0.005 0.132