2013-04-26 157 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)))