我最近一直在處理大得多的數據集,並開始學習並遷移到data.table以提高聚合/分組的性能。我一直無法按預期得到某些表達式或函數。以下是我遇到麻煩的基本操作組示例。返回向量的data.table聚合,如scale()
library(data.table)
category <- rep(1:10, 10)
value <- rnorm(100)
df <- data.frame(category, value)
dt <- data.table(df)
如果我想簡單地按類別計算每個組的平均值。這工作很容易。
dt[,mean(value),by="category"]
category V1
1: 1 -0.67555478
2: 2 -0.50438413
3: 3 0.29093723
4: 4 -0.41684790
5: 5 0.33921764
6: 6 0.01970997
7: 7 -0.23684245
8: 8 -0.04280998
9: 9 0.01838804
10: 10 0.44295978
我遇到的問題,如果我嘗試使用規模功能,甚至一個簡單的表達減去自身的價值。分組被忽略,我得到應用到每一行的函數/表達式。以下內容按類別返回所有100行而不是10個組。
dt[,scale(value),by="category"]
dt[,value-mean(value),by="category"]
我認爲重新創建比例作爲返回數值向量而不是矩陣的函數可能會有所幫助。
zScore <- function(x) {
z=(x-mean(x,na.rm=TRUE))/sd(x,na.rm = TRUE)
return(z)
}
dt[,zScore(value),by="category"]
category V1
1: 1 -1.45114132
2: 1 -0.35304528
3: 1 -0.94075418
4: 1 1.44454416
5: 1 1.39448268
6: 1 0.55366652
....
97: 10 -0.43190602
98: 10 -0.25409244
99: 10 0.35496694
100: 10 0.57323480
category V1
這還返回應用於所有行(N = 100)的zScore函數並忽略分組。爲了在使用mean()時獲得scale()或自定義函數以使用上面的分組,我錯過了什麼?
'mean'返回1個值。 'scale'函數爲每個輸入返回一個縮放值。也就是說,'scale(1:5)'給出了5個值。'平均(1:5)'給出1個值。這有助於理解你的問題嗎? – Arun 2013-04-05 14:30:18
您應用於'分組的'變量的函數應返回1值而不是向量。 – 2013-04-05 14:45:28
這正是問題所在。我正在嘗試使用ddply的方式使用data.table。我如何使用data.table來等價地實現以下內容。在ddply? 'ddply(df,「category」,transform,zscorebycategory = zScore(value))' – Aaron 2013-04-05 15:38:35