2013-03-01 118 views
0

使用下面的代码,我写了一个函数,它给出了每行(1)中值的平均值。现在我想计算行i中每个值(i,j)与行i中计算的均值(使用函数)的偏差。我在下面写了一个函数(2),但它似乎没有工作。有人可以帮忙吗?计算每行的平均偏差

(1) n=28 
k=4 

Avg <- function (n,k) { 
    for (i in 1:28) { 
    AverageGrades[i]=((rowSums(Z)[i])/k) 
    } 
    return(AverageGrades) 
} 
AverageGrades=Avg(28,4) 
AverageGrades 

其中

Z is: 
> Z 
      V1  V2  V3  V4 
[1,] 77.81146 80.37801 72.33208 77.73541 
[2,] 70.38343 62.33750 67.74083 71.18287 
[3,] 69.03035 74.43367 77.87572 77.89755 
[4,] 83.05206 83.07390 71.76214 80.16890 
[5,] 70.61465 60.07529 59.31726 69.93781 
[6,] 72.22979 59.44618 74.65016 68.75547 
[7,] 75.28208 79.15410 81.72065 73.67472 
[8,] 94.78838 88.89368 73.35592 84.79245 
[9,] 78.00313 66.96430 78.79857 95.90012 
[10,] 66.70869 81.91267 76.01797 60.48021 
[11,] 69.98514 54.44738 65.88391 64.10529 
[12,] 80.21977 78.44115 74.95861 78.83063 
[13,] 87.17776 76.04111 77.99261 74.81652 
[14,] 75.67206 68.03770 56.90106 58.85256 
[15,] 68.63858 79.25913 75.31810 82.69422 
[16,] 65.40212 77.23639 94.33794 86.70359 
[17,] 66.59640 75.00316 63.96433 75.79860 
[18,] 65.77463 73.59685 63.05748 62.29946 
[19,] 78.46871 77.71069 88.33124 84.39021 
[20,] 71.37807 78.75419 65.97058 81.17457 
[21,] 72.17469 75.61673 75.63857 64.32681 
[22,] 65.97012 62.48757 66.35959 68.92614 
[23,] 86.51898 82.57795 89.95407 77.17046 
[24,] 77.95162 79.90312 76.72703 84.54925 
[25,] 83.10545 79.92936 87.75158 77.21221 
[26,] 69.64127 81.07779 79.29918 75.81663 
[27,] 81.02364 69.71188 78.11864 67.07981 
[28,] 71.42319 88.52474 80.89039 69.75374 


(2)  Deviation= function (n,k){ 
for(i in 1:28){ 
    AverageGrades[i]=((rowSums(Z)[i])/k) 
} 
return(AverageGrades) 
} 
{ 
    for (j in 1:4) { 
dev[i,j]=(Z[i,j]-AverageGrades[i]) 
} 
return(dev) 
} 
+2

什么语言? – 2013-03-01 07:39:58

+0

我收集它的R. – minopret 2013-03-01 07:43:55

回答

3

你不需要让自己的功能。只需使用函数rowMeans()来计算行排序并使用这些值来偏离这些方式。

Z<-matrix(sample(1:40),ncol=4) 
Z 
     [,1] [,2] [,3] [,4] 
[1,] 32 19 35 4 
[2,] 11 31 33 38 
[3,] 15 29 2 8 
[4,] 18 34 5 3 
[5,] 21 24 39 10 
[6,] 9 16 27 30 
[7,] 20 1 37 17 
[8,] 22 23 25 40 
[9,] 12 7 26 6 
[10,] 13 28 36 14 

rowMeans(Z) 
[1] 22.50 28.25 13.50 15.00 23.50 20.50 18.75 27.50 12.75 22.75 

Z-rowMeans(Z) 
     [,1] [,2] [,3] [,4] 
[1,] 9.50 -3.50 12.50 -18.50 
[2,] -17.25 2.75 4.75 9.75 
[3,] 1.50 15.50 -11.50 -5.50 
[4,] 3.00 19.00 -10.00 -12.00 
[5,] -2.50 0.50 15.50 -13.50 
[6,] -11.50 -4.50 6.50 9.50 
[7,] 1.25 -17.75 18.25 -1.75 
[8,] -5.50 -4.50 -2.50 12.50 
[9,] -0.75 -5.75 13.25 -6.75 
[10,] -9.75 5.25 13.25 -8.75 
+0

谢谢,但如果我想写它作为一个函数,我会怎么做呢? – Titi90 2013-03-01 14:12:05

0

您可以使用scale获得柱偏差(因为它执行中心),所以只用这个转置,并转再次得到您想要的输出:

x <- matrix(sample(1:12),4) 
x 
    [,1] [,2] [,3] 
[1,] 6 4 1 
[2,] 12 3 7 
[3,] 9 10 11 
[4,] 2 5 8 
t(scale(t(x),scale=F)) 
      [,1]  [,2]  [,3] 
[1,] 2.333333 0.3333333 -2.6666667 
[2,] 4.666667 -4.3333333 -0.3333333 
[3,] -1.000000 0.0000000 1.0000000 
[4,] -3.000000 0.0000000 3.0000000 
attr(,"scaled:center") 
[1] 3.666667 7.333333 10.000000 5.000000 

中心属性给出该行意味着。

0

您可以使用sweeprowMeans为:

> set.seed(1) # for the sample to be reproducible 
> x <- matrix(sample(1:12),4) 
> sweep(x, 1, rowMeans(x)) 
      [,1]  [,2]  [,3] 
[1,] 1.0000000 -1.000000 0.000000 
[2,] 0.6666667 2.666667 -3.333333 
[3,] -3.0000000 1.000000 2.000000 
[4,] -0.6666667 2.333333 -1.666667 

进一步详情,请参阅?sweep

1

你可以使用apply以更“R like”的方式思考你的循环。

(Z <- data.frame(V1=runif(28,0,100), V2=runif(28,0,100), 
       V3=runif(28,0,100), V4=runif(28,0,100))) 

(Z.dev <- Z - apply(Z, MARGIN=1, FUN=mean))