从R中的行和中省略inf

从R中的行和中省略inf,r,rowsum,R,Rowsum,所以我试图求一个矩阵的行和,其中有inf。如何计算行的总和,忽略inf?试试这个 m <- c( 1 ,2 , 3 , Inf , 4 , Inf ,5 ) sum(m[!is.infinite(m)]) mA[is.infinite(A)]我会使用apply和is.infinite来避免用NA替换Inf值,就像@Hemmo的答案一样 > set.seed(1) > Mat <- matrix(sample(c(1:5, Inf), 50, TRUE), ncol=5)

所以我试图求一个矩阵的行和,其中有inf。如何计算行的总和,忽略inf?

试试这个

m <- c( 1 ,2 , 3 , Inf , 4 , Inf ,5 )
sum(m[!is.infinite(m)])

m
A[is.infinite(A)]我会使用
apply
is.infinite
来避免用
NA
替换
Inf
值,就像@Hemmo的答案一样

> set.seed(1)
> Mat <- matrix(sample(c(1:5, Inf), 50, TRUE), ncol=5)
> Mat # this is an example
      [,1] [,2] [,3] [,4] [,5]
 [1,]    2    2  Inf    3    5
 [2,]    3    2    2    4    4
 [3,]    4    5    4    3    5
 [4,]  Inf    3    1    2    4
 [5,]    2    5    2    5    4
 [6,]  Inf    3    3    5    5
 [7,]  Inf    5    1    5    1
 [8,]    4  Inf    3    1    3
 [9,]    4    3  Inf    5    5
[10,]    1    5    3    3    5
> apply(Mat, 1, function(x) sum(x[!is.infinite(x)]))
 [1] 12 15 21 10 18 16 12 11 17 17
>设置种子(1)
>这是一个例子
[,1] [,2] [,3] [,4] [,5]
[1,]2 Inf 3 5
[2,]    3    2    2    4    4
[3,]    4    5    4    3    5
[4,]Inf 3 1 2 4
[5,]    2    5    2    5    4
[6,]Inf 3 3 5
[7,]Inf 5 1
[8,]4 Inf 3 1 3
[9,]4 3 Inf 5
[10,]    1    5    3    3    5
>应用(Mat,1,函数(x)和(x[!is.无穷大(x)])
[1] 12 15 21 10 18 16 12 11 17 17

将矩阵乘以
is.finite(m)
的结果,然后对具有
na.rm=TRUE的乘积调用
行和
。这是因为
Inf*0
NaN

m <- matrix(c(1:3,Inf,4,Inf,5:6),4,2)
rowSums(m*is.finite(m),na.rm=TRUE)
m这是一种“非应用”和非破坏性的方法:

rowSums( matrix(match(A, A[is.finite(A)]), nrow(A)), na.rm=TRUE)
[1] 2 4

虽然它的效率相当高,但不如Johsua的乘法法快。

你可以用
一次完成!is.infinite()
!所以我会使用
和,你知道测量单位是百万分之一秒,对吗?!但是是的,对于较大的矩阵,NA子集设置要快0.004秒!:-)是的,当然差异很小,我不认为有任何有意义的差异,基准测试很有趣:)如果你要替换矩阵中的值,你可以替换为
0
,左
na.rm=FALSE
,这可能会更快。我们似乎发布了完全相同的方法!我提供+1的所有方面,再次阐明了许多方法来做同样的事情,并让我思考最好的方法来做一些简单的事情。我喜欢约书亚的把戏。好吧,我想你的意思是
匹配(A,A[is.finite(A)])
。我编辑过。希望你不介意。这不是在我的会话中起作用的代码。似乎ti的效率会降低。你是说我的编辑不是你的代码?我用
A[is.finite(A)]
替换了
is.finite(A)
。如果没有此选项,
match
将吐出所有NAs,因为它将所有值与TRUE匹配。因此,只有值1与TRUE匹配。其他每个值都会得到NA。我猜我的测试用例有不同的结果,但它只是一个2 x 2的矩阵。我很震惊没有人问传统的StackOverflow问题:“你尝试了什么?”我震惊于+9(到目前为止)。Upvote清楚地指出这个问题表明了研究的努力
> set.seed(1)
> Mat <- matrix(sample(c(1:5, Inf), 50, TRUE), ncol=5)
> Mat # this is an example
      [,1] [,2] [,3] [,4] [,5]
 [1,]    2    2  Inf    3    5
 [2,]    3    2    2    4    4
 [3,]    4    5    4    3    5
 [4,]  Inf    3    1    2    4
 [5,]    2    5    2    5    4
 [6,]  Inf    3    3    5    5
 [7,]  Inf    5    1    5    1
 [8,]    4  Inf    3    1    3
 [9,]    4    3  Inf    5    5
[10,]    1    5    3    3    5
> apply(Mat, 1, function(x) sum(x[!is.infinite(x)]))
 [1] 12 15 21 10 18 16 12 11 17 17
m <- matrix(c(1:3,Inf,4,Inf,5:6),4,2)
rowSums(m*is.finite(m),na.rm=TRUE)
rowSums( matrix(match(A, A[is.finite(A)]), nrow(A)), na.rm=TRUE)
[1] 2 4