2012-10-26 52 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語法和效率。