1

sp_full_in是矩阵:

   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
1  0 1 1 1 1 2 2 2 1  1  1  1  1  2  1  1  1  1  1  1  2
2  1 0 1 1 1 1 1 1 1  1  1  2  1  1  1  1  1  1  1  1  1
3  2 2 0 2 2 2 2 2 2  1  1  2  2  2  1  2  1  1  1  2  1
4  1 2 1 0 2 2 2 1 2  1  1  1  2  2  1  2  1  1  2  2  1
5  2 2 2 2 0 2 2 2 2  1  1  2  1  2  1  2  1  1  1  2  2
6  2 1 1 1 1 0 1 1 1  2  2  2  2  2  1  2  1  2  2  1  1
7  2 1 1 2 1 1 0 1 1  2  1  1  2  1  1  2  1  1  1  2  1
8  1 2 1 1 1 2 2 0 1  1  1  2  2  2  1  2  1  1  2  1  1
9  2 2 1 2 1 1 2 2 0  1  1  2  1  2  1  2  1  1  2  2  2
10 2 2 1 1 1 2 2 1 1  0  2  2  2  2  1  1  1  1  1  2  2
11 2 2 1 1 1 2 1 1 1  1  0  2  1  2  1  2  1  1  1  1  2
12 1 2 1 1 2 1 1 2 1  1  1  0  2  2  1  2  1  2  1  1  1
13 2 2 2 2 1 3 2 2 2  1  1  3  0  2  1  2  2  1  2  2  2
14 2 2 1 2 1 2 1 2 1  2  2  2  1  0  1  2  1  1  1  1  1
15 2 2 2 2 2 2 2 2 2  1  1  2  2  1  0  2  1  1  1  1  2
16 1 2 2 1 1 2 2 2 1  1  2  2  2  2  1  0  1  1  2  1  2
17 2 2 1 1 1 1 1 2 1  1  1  1  2  2  1  2  0  2  2  1  1
18 1 1 1 1 1 2 1 1 1  1  1  2  1  1  1  1  2  0  1  1  1
19 2 2 1 2 1 2 2 2 2  1  1  2  2  2  1  2  1  1  0  2  2
20 2 2 1 1 1 2 2 2 2  1  2  2  2  2  1  2  1  1  1  0  1
21 1 1 1 1 1 1 1 1 1  2  2  1  2  1  1  2  1  1  2  1  0

mean(sp_full_in[which(sp_full_in != Inf)])

产生结果[1] 1.38322

我不太确定我理解它的作用,但我阅读它的方式是:对于 sp_full_in 中的每个单元格,检查它是否不是无限的,如果是,则返回输出 1,然后平均所有输出。那是对的吗?如果没有,应该如何准备?

4

3 回答 3

4

which(sp_full_in != Inf)返回一个整数向量(其中只有一个是 1)。然后将该整数向量作为索引传递给“[” sp_full_in,并将所有值sp_full_in作为传递给mean函数的向量返回。

学习“由内而外”地阅读 R 表达式是一个好主意。找到最里面的函数调用并对其进行心理评估,在这种情况下sp_full_in != Inf,。这将返回传递给的所有 TRUE 的逻辑矩阵which(),并且由于没有“arr.ind”参数,因此它返回索引的原子向量。

于 2013-05-29T20:28:26.727 回答
1

其他答案很好地解释了为什么你得到矩阵中所有有限项的平均值,但值得注意的是,在这种情况下,which 什么都不做。我以前也有过度使用的坏习惯which

> a <- matrix(rnorm(4), nrow = 2)
> a
           [,1]       [,2]
[1,]  0.5049551 -0.7844590
[2,] -1.7170087 -0.8509076
> a[which(a != Inf)]
[1]  0.5049551 -1.7170087 -0.7844590 -0.8509076
> a[a != Inf]
[1]  0.5049551 -1.7170087 -0.7844590 -0.8509076
> a[1] <- Inf
> a
          [,1]       [,2]
[1,]       Inf -0.7844590
[2,] -1.717009 -0.8509076
> a[which(a != Inf)]
[1] -1.7170087 -0.7844590 -0.8509076
## Similarly if there was an Infinite value
> a[a != Inf]
[1] -1.7170087 -0.7844590 -0.8509076

而且,当我们谈到它时,我们还应该提到is.finite通常比!= Inf. 将is.finite返回,和. FALSE_Inf-InfNANaN

于 2013-05-29T23:39:25.927 回答
0

不,但是你很接近,当应用于矩阵时,它会根据条件检查矩阵的每个单元格,这里是 Not Inf。返回满足条件的所有单元格的索引,然后根据您的代码,根据返回的索引输出单元格的值,最后计算它们的平均值。

于 2013-05-29T20:34:34.170 回答