这个R表达式有什么作用?

时间:2013-05-29 20:20:54

标签: r

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 ,然后平均所有输出。那是对的吗?如果没有,应该如何准备?

3 个答案:

答案 0 :(得分:4)

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

学习从"里面外出"中学习R表达式是个好主意。找到最里面的函数调用并进行心理评估,在本例中为sp_full_in != Inf。这将返回一个传递给which()的所有TRUE的逻辑矩阵,因为没有' arr.ind'参数,它返回索引的原子向量。

答案 1 :(得分: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会在FALSEInf-InfNA上返回NaN

答案 2 :(得分:0)

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