使用data.table日期时,我对访问和身份证上的日期数据:效率排名中的R
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
我在想我是在做一些“错误的”,或者只是需要耐心等待。
尝试'setkey(DT,date); system.time(DT [,visit.n:= 1:.N,by = id])' –
假设你喜欢混乱的日期,你可以在i中使用order(date)来排序做新的col。如果你关心性能,你可能会考虑日期的整数存储格式,所以'system.time(DT [,date:= as.IDate(date)] [order(date),visit.n:= 1:.N ])'我看到这个花费的时间是Martin的setkey的一半。另请注意,该软件包的作者说:“因此,大多数情况下,不应该有必要再设置密钥。” http://stackoverflow.com/a/20057411/ – Frank
有趣。但是你的代码行不会产生所需的输出,对吧?当添加'by = id'(所以输出是正确的)时,当'by = id'时,性能工作再次翻倍... –