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)
}
4

4 回答 4

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
于 2013-03-01T09:15:43.520 回答
1

您可以使用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

于 2013-03-01T11:40:54.397 回答
1

您可以使用 apply 以更“类似 R”的方式考虑您的循环。

( 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) )
于 2013-03-01T15:58:17.857 回答
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

center 属性给出了行的意思。

于 2013-03-01T10:11:06.440 回答