2012-10-26 18 views
1

我有这样一个数据帧:比较意味着对特定数据值中的R

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 

converint后至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列对平均比较为每个进程看的异常值。但是,这个命令需要很长时间才能完成。有一个更好的方法吗?

+1

你能编辑你的问题(和标签)来澄清这是否实际上是一个data.table或不? – joran

+1

你打算如何比较?以及你期望最后一行代码返回什么?我想你可能想要添加一个月的列,然后使用'by = month',但我真的不明白你希望做什么。你能否包括最后一行代码的预期输出以及最终的期望结果? – Justin

+0

当使用':='时,不需要重新分配给'x',因为这是通过引用分配给'x'。我也不会在data.tables中使用'subset'或'$',因为这会避免所有'data.table'的效率。 – mnel

回答

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.tableDate键。在目前的形式中,这最后一步是矢量扫描,但单个矢量扫描不应该太低效。

我会推荐阅读介绍小插曲以更好地利用data.table语法和效率。