8
> x <- array(-10:10, dim=c(4,5))
> x
     [,1] [,2] [,3] [,4] [,5]
[1,]  -10   -6   -2    2    6
[2,]   -9   -5   -1    3    7
[3,]   -8   -4    0    4    8
[4,]   -7   -3    1    5    9

如何将“max(x,0)”应用于每个元素,以便获得此矩阵:

     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    2    6
[2,]    0    0    0    3    7
[3,]    0    0    0    4    8
[4,]    0    0    1    5    9
4

3 回答 3

18

使用pmax

pmax(x,0)
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    0    0    0    2    6
#[2,]    0    0    0    3    7
#[3,]    0    0    0    4    8
#[4,]    0    0    1    5    9
于 2013-05-22T16:07:00.133 回答
5

您可以使用 R 的索引功能[直接执行此操作:

x <- array(-10:10, dim=c(4,5))
x[x < 0] <- 0

这是有效的,因为x < 0创建了一个逻辑矩阵输出:

x < 0

     [,1] [,2]  [,3]  [,4]  [,5]
[1,] TRUE TRUE  TRUE FALSE FALSE
[2,] TRUE TRUE  TRUE FALSE FALSE
[3,] TRUE TRUE FALSE FALSE FALSE
[4,] TRUE TRUE FALSE FALSE FALSE

得到的矩阵是:

     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    2    6
[2,]    0    0    0    3    7
[3,]    0    0    0    4    8
[4,]    0    0    1    5    9

这两种方法之间的时间惊人地相似。这是一个更大的示例,说明了可比较的时间:

xbigC <- xbigE <- matrix(sample(-100:100, 1e8, TRUE), ncol = 1e4)
system.time(xbigC[xbigC < 0] <- 0)
 #--- 
  user  system elapsed 
   4.56    0.37    4.93 
system.time(xbigE  <- pmax(xbigE,0))
#---
   user  system elapsed 
   4.10    0.51    4.62 
all.equal(xbigC, xbigE)
#---
[1] TRUE
于 2013-05-22T16:10:06.087 回答
1

pmax()当输入是矩阵时,参数的顺序似乎会影响返回的类:

pmax(0,x)
[1] 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9

pmax(x,0)
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    2    6
[2,]    0    0    0    3    7
[3,]    0    0    0    4    8
[4,]    0    0    1    5    9
于 2018-06-20T23:54:00.187 回答