2011-08-25 58 views
4

我有數據幀看起來像這樣

V1 V2 
.. 1 
.. 2 
.. 1 
.. 3 

對於每一個不同的值V2我想計算方差V1中的數據。我剛剛開始與R的冒險,任何提示如何做到這一點?我的具體情況我想我可以做手工類似

var1 = var(data[data$V2==1, "V1"]) 
var2 = ... 

等,因爲我知道所有可能的V2值(沒有很多),但我很好奇,什麼是更通用的解決方案。有任何想法嗎?

回答

3
library(reshape) 
ddply(data, .(V2), summarise, variance=var(V1)) 
+0

是不是ddply在plyr包?我需要更多地使用ddply。對於.variable命名約定有些東西並不直觀,總結的使用看起來很隨意。 – nzcoops

+0

是的。 Plyr是重塑的必備軟件包。我同時使用兩個函數,所以我通常只是導入重塑 – wespiserA

+0

啊,這很有道理:) – nzcoops

3

有幾個方法可以做到這一點,我更喜歡:

dat <- data.frame(V1 = rnorm(50), V2=rep(1:5,10)) 
dat 

aggregate (V1~V2, data=dat, var) # The first argument tells it to group V1 based on the values in V2, the last argument simply tells it the function to apply. 

> aggregate (V1~V2, data=dat, var) 
    V2  V1 
1 1 0.9139360 
2 2 1.6222236 
3 3 1.2429743 
4 4 1.1889356 
5 5 0.7000294 

還應考慮ddply,daply等在plyr包。

+0

謝謝,這非常有幫助。我會在8分鐘內接受這個答案 – mkk

+0

實際上我衝了一點點,當我複製粘貼你的例子我得到錯誤:錯誤獲取(as.character(FUN),mode =「function」,envir = envir): object模式'功能'的'FUN'未找到 – mkk

+0

第二個。我有最新版本,我猜,2.13.1(Windows 7)。也許這是因爲沒有加載一些軟件包?無論如何,我已經設法使它通過ddply工作。我有複製粘貼的wespiserA代碼,並且沒有任何修改就成爲了魅力,所以我會接受他的回答。我嘗試了一些簡單的東西來修復你的方法,比如添加FUN = var但是它仍然不想工作 – mkk

7

使用data.table的另一種解決方案。它速度更快,尤其適用於擁有大量數據集的情況。

require(data.table) 
dat2 = data.table(dat) 
ans = dat2[,list(variance = var(V1)),'V2'] 
+0

+1數據。表 – Andrie

9

和老待機,tapply

dat <- data.frame(x = runif(50), y = rep(letters[1:5],each = 10)) 
tapply(dat$x,dat$y,FUN = var) 

     a   b   c   d   e 
0.03907351 0.10197081 0.08036828 0.03075195 0.08289562 
+1

我第二。 。 。在Stack Overflow的接受答案中,'* apply'函數族非常強大並且代表性不足。 – adamleerich

相關問題