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 ,然后平均所有输出。那是对的吗?如果没有,应该如何准备?
答案 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
会在FALSE
,Inf
,-Inf
和NA
上返回NaN
。
答案 2 :(得分:0)
不,但是你很接近,当将应用于矩阵时,它会根据条件检查矩阵的每个单元格,这里是非Inf。返回满足条件的所有单元格的索引,然后根据您的代码,根据返回的索引输出单元格的值,最后计算其平均值。