我有一个这样的数据框:
Date Process Duration
1/1/2012 xnit 10
1/1/2012 xnit 15
1/1/2012 xnit 20
1/2/2012 telnet 80
1/2/2012 telnet 50
1/2/2012 telnet 40
8/1/2012 ftp 3
8/1/2012 ftp 11
8/1/2012 ftp 12
收敛到x< -data.table(x):
之后我可以计算每项工作的平均值:
x<-x[, mean := mean(Duration), by = Process]
我喜欢比较特定日期持续时间与平均值的持续时间。我试过这个:
x<-x[, Aug1 := subset(x, Date==as.Date(c("2012-08-01")))$Duration, by = Process]
一旦得到这个值,我就会将Aug1列与每个进程的平均值进行比较,以查看异常值。但是,此命令需要很长时间才能完成。有更好的方法吗?
答案 0 :(得分:2)
使用:=
时无需重新分配x,因为这是通过引用分配给x(特别是从版本1.8.3开始默认不打印)。我也不会在data.tables中使用子集或$
,因为这会避免所有data.table效率。 -
尝试这样的事情
x <- data.table(x)
# add a column that is the by-process mean
x[, mean_duration := mean(Duration), by = Process]
# calculate the difference
x[, diff_duration := Duration - mean_duration]
# subset just the 1st of august
x[Date==as.Date("2012-08-01")]
如果data.table
由Date
键入,则可以更有效地完成此最终子集。在当前形式中,最后一步是矢量扫描,但单个矢量扫描的效率不应太低。
我建议阅读介绍小插图,以更好地利用data.table语法和效率。