我有數據幀看起來像這樣
V1 V2
.. 1
.. 2
.. 1
.. 3
等
對於每一個不同的值V2我想計算方差V1中的數據。我剛剛開始與R的冒險,任何提示如何做到這一點?我的具體情況我想我可以做手工類似
var1 = var(data[data$V2==1, "V1"])
var2 = ...
等,因爲我知道所有可能的V2值(沒有很多),但我很好奇,什麼是更通用的解決方案。有任何想法嗎?
我有數據幀看起來像這樣
V1 V2
.. 1
.. 2
.. 1
.. 3
等
對於每一個不同的值V2我想計算方差V1中的數據。我剛剛開始與R的冒險,任何提示如何做到這一點?我的具體情況我想我可以做手工類似
var1 = var(data[data$V2==1, "V1"])
var2 = ...
等,因爲我知道所有可能的V2值(沒有很多),但我很好奇,什麼是更通用的解決方案。有任何想法嗎?
library(reshape)
ddply(data, .(V2), summarise, variance=var(V1))
有幾個方法可以做到這一點,我更喜歡:
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包。
謝謝,這非常有幫助。我會在8分鐘內接受這個答案 – mkk
實際上我衝了一點點,當我複製粘貼你的例子我得到錯誤:錯誤獲取(as.character(FUN),mode =「function」,envir = envir): object模式'功能'的'FUN'未找到 – mkk
第二個。我有最新版本,我猜,2.13.1(Windows 7)。也許這是因爲沒有加載一些軟件包?無論如何,我已經設法使它通過ddply工作。我有複製粘貼的wespiserA代碼,並且沒有任何修改就成爲了魅力,所以我會接受他的回答。我嘗試了一些簡單的東西來修復你的方法,比如添加FUN = var但是它仍然不想工作 – mkk
使用data.table
的另一種解決方案。它速度更快,尤其適用於擁有大量數據集的情況。
require(data.table)
dat2 = data.table(dat)
ans = dat2[,list(variance = var(V1)),'V2']
+1數據。表 – Andrie
和老待機,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
我第二。 。 。在Stack Overflow的接受答案中,'* apply'函數族非常強大並且代表性不足。 – adamleerich
是不是ddply在plyr包?我需要更多地使用ddply。對於.variable命名約定有些東西並不直觀,總結的使用看起來很隨意。 – nzcoops
是的。 Plyr是重塑的必備軟件包。我同時使用兩個函數,所以我通常只是導入重塑 – wespiserA
啊,這很有道理:) – nzcoops