2013-04-26 216 views
2

我正在嘗試爲三階段集羣採樣構建一個函數的代碼,但是,我現在只使用虛擬數據,因此我可以理解將要進入的內容我的功能。for循環通過數據幀和使用唯一值循環

我正在爲循環工作,並有一個數據框與分組值。我有一個具有數據的數據幀:

Cluster group value value.K.bar value.M.bar  N.bar 
1  1  A 1  1.5   2.5    4 
2  1  A 2  1.5   2.5    4 
3  1  B 3  4.0   2.5    4 
4  1  B 4  4.0   2.5    4 
5  2  B 5  4.0   6.0    4 
6  2  C 6  6.5   6.0    4 
7  2  C 7  6.5   6.0    4 

,我試圖運行for循環

n <- dim(data)[1] 
e <- 0 
total <- 0 
for(i in 1:n) {e = data.y$value.M.bar[i] - data$N.bar[i] 
       total = total + e^2} 

我的問題是:有沒有辦法運行相同的循環,但對於組中的獨特價值?說:

Group 'A', 'B', 'C' 

任何幫助將不勝感激!

編輯:正確的語言

+0

是什麼'數據.y'而不是'data'? – 2013-04-26 23:26:08

+0

只是想一想你的例子:在我的(有限的)實際數據體驗中,我發現將計算值(如'value.K.bar')與原始數據一起存儲是一種糟糕的策略,因爲如果/當我子集或放置行,那些計算出的值可能會失效。 – Frank 2013-04-27 04:07:54

回答

4

可以使用by例如,每組應用數據。首先,我將你的代碼封裝在一個以數據爲輸入的函數中。

get.total <- function(data){ 
    n <- dim(data)[1] 
    e <- 0 
    total <- 0 
    for(i in 1:n) { 
    e <- data$value.M.bar[i] - data$N.bar[i] ## I correct this line 
    total <- total + e^2 
    } 
    total 
} 

然後計算總只爲B,C組你這樣做:

by(data,data$group,FUN=get.total) 
data$group: A 
[1] 4.5 
---------------------------------------------------------------------------------------------------- 
data$group: B 
[1] 8.5 
---------------------------------------------------------------------------------------------------- 
data$group: C 
[1] 8 

不過還好,這裏一個矢量版本的功能

by(data,data$group, 
     function(dat)with(dat, sum((value.M.bar - N.bar)^2)))